#signing #eip-712 #crypto #blockchain #utilities

eip_712_utils

提供EIP-712消息签名的实用工具的Rust库

1 个不稳定版本

0.1.0 2024年6月21日

#4 in #eip-712

MITGPL-3.0 许可证

40KB
871

EIP-712 Rust实用工具

概述

eip_712_utils 包是提供EIP-712消息签名的实用工具的Rust库。这个库旨在简单创建、签名和验证EIP-712结构化数据,尤其是用于NFT(非同质化代币)。

功能

  • 生成符合EIP-712的结构化数据
  • 按照EIP-712规范哈希结构化数据
  • 签名EIP-712结构化数据

安装

cargo添加 eip_712_utils

使用

生成和签名结构化数据


#[cfg(test)]
mod tests {
    use rustc_hex::ToHex;
    use serde_json::json;

    use super::*;

    #[test]
    fn generate_hash_and_sign_it() {
        let name = "AionRisingNFTs";
        let version = "0.0.1";
        let chain_id = "0x7A69";
        let verifying_contract = "0x037eDa3aDB1198021A9b2e88C22B464fD38db3f3";
        let token_id = "0x1";
        let amount = "0x1";
        let to = "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496";
        let nonce = "0x1";

        let custom_fields = vec![
            FieldType {
                name: "tokenId".to_string(),
                type_: "uint256".to_string(),
            },
            FieldType {
                name: "amount".to_string(),
                type_: "uint256".to_string(),
            },
            FieldType {
                name: "to".to_string(),
                type_: "address".to_string(),
            },
            FieldType {
                name: "nonce".to_string(),
                type_: "uint256".to_string(),
            },
        ];

        let data: EIP712 = EIP712::builder()
            .domain(name, version, chain_id, verifying_contract)
            .custom_field(("NFTData".to_string(), custom_fields))
            .message(json!({
                "tokenId": token_id,
                "amount": amount,
                "to": to,
                "nonce": nonce
            }))
            .build();

        let hashed_structured_data = hash_structured_data(data).unwrap().to_hex::<String>();

        let private_key = 659918_u32;
        let signature = sign_message(&hashed_structured_data, private_key);
        let expected_signature = "b9c658f86d985ad0502584c70ea520cf68523e4013786f83f216de093ef9467e453d27fe627278ab0c8425906843a706f66a9c3120b37e88ac722aa217a04fcf1b";
        assert_eq!(signature, expected_signature);
    }
}

API参考

模块

eip712

此模块提供了EIP-712编码和哈希的核心功能。

  • EIP712

    • 表示EIP-712结构化数据。
    • 方法
      • builder() -> EIP712Builder:返回一个新的EIP712构建器。
      • domain(name, version, chain_id, verifying_contract):设置域参数。
      • custom_field((field_name, fields)):向EIP-712结构添加自定义字段。在这里您可以使用您特定的NFT数据。需要注意的是,此字段将用作哈希数据的根节点。如果没有提供,则使用的根节点将是 EIP712Domain
      • message(message):设置消息数据。最简单的方法是使用 json!serde,如示例所示。
      • build() -> EIP712:构建EIP-712结构化数据。
  • EIP712Domain

    • 表示EIP-712域。
    • 字段: nameversionchain_idverifying_contract
  • 字段类型

    • 表示EIP-712结构中的字段类型。
    • 字段: nametype_
  • 消息类型

    • 表示EIP-712结构中的消息类型。
  • hash_structured_data(data: EIP712) -> Result<H256, Error>

    • 对EIP-712结构化数据进行哈希处理。
    • 参数: data - EIP-712结构化数据。
    • 返回:结构化数据的哈希值。

nft_helpers

此模块包含专门用于NFT相关操作的辅助函数。

  • hash_structured_data_string(data: String) -> Result<H256, Error>
    • 对作为JSON字符串提供的EIP-712结构化数据进行哈希处理。
    • 参数: data - 表示EIP-712结构化数据的JSON字符串。
    • 返回:结构化数据的哈希值。

签名

此模块提供用于签名EIP-712消息的工具。

  • sign_message(message: &Message, private_key: &SecretKey) -> Signature
    • 签名给定的EIP-712消息。
    • 参数: message - 要签名的EIP-712消息,private_key - 用于签名的私钥。
    • 返回:消息的签名。

运行测试

使用以下命令运行测试

cargo test

贡献

欢迎贡献!请打开GitHub上的问题或提交pull请求。

许可证

本项目受MIT许可证的许可。

依赖

~15MB
~249K SLoC