首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在智能契约中使用_hashTypedDataV4,而在前端使用_signTypedData(etherjs)则不起作用

在智能契约中使用_hashTypedDataV4,而在前端使用_signTypedData(etherjs)则不起作用
EN

Stack Overflow用户
提问于 2022-04-04 04:29:57
回答 1查看 811关注 0票数 3

我试图在前端使用_signTypedData(etherjs)对nft数据进行编码,如下所示

代码语言:javascript
复制
 const domain = {
    name: "og-nft",
    version: "1",
  };
  const types = {
    Nft: [
      { name: "URI", type: "string" },
      { name: "price", type: "uint256" },
    ],
  };

  // The data to sign
  const [voucher, setVoucher] = useState({
    URI: "",
    price: '1',
  });
const signature = await signer._signTypedData(domain, types, voucher);

参考以上文档中的signTypedData

我将凭证和签名存储在mongo数据库中,我已经在硬帽上部署了智能契约,我正在使用ECDSA.recover查看凭证的签名者来验证签名的真实性。

代码语言:javascript
复制
function verifyVoucher(NFTVoucher calldata voucher, bytes memory signature)
        public
        view
        returns (address)
    {
        require(voucher.price > 0, "Price must be greater than 0");
      //  require(voucher.tokenId > 0, "Token ID must be greater than 0");
        bytes32 hash = _hash(voucher);
        //string memory hash="";
        return ECDSA.recover(hash, signature);
    }

但是这样做的结果与实际的签字人并不匹配。我想我在上面使用的散列函数中犯了一些错误。

代码语言:javascript
复制
0xe8c795f9168269940b31a470ad82e89a453e88b9 signer
0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 owner

下面是哈希函数。

代码语言:javascript
复制
function _hash(NFTVoucher calldata voucher)
        internal
        view
        returns (bytes32)
    {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256(
                            "Nft(string URI,uint256 price)"
                        ),
                        keccak256(bytes(voucher.URI)),
                        voucher.price
                    )
                )
            );
    }

参考以上hashTypedDataV4

EN

回答 1

Stack Overflow用户

发布于 2022-04-27 08:27:12

这是erc20permit的例子,希望能对你有所帮助。

代码语言:javascript
复制
function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
    require(deadline >= block.timestamp, "ERC20Permit: expired deadline");
        
    bytes32 hashStruct = keccak256(
        abi.encode(
            keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"),
            owner,
            spender,
            amount,
            nonce[owner],
            deadline
        )
    );

    bytes32 hash = keccak256(
        abi.encodePacked(
            '\x19\x01',
            keccak256(abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
            keccak256(bytes(name_)),
            keccak256(bytes(version())),
            chainId,
            address(this)
        ),
            hashStruct
        )
    );
    
   
    address signer = ecrecover(hash, v, r, s);
    require(
        signer != address(0) && signer == owner,
        "ERC20Permit: invalid signature"
    );
    nonces[owner]++;
    _approve(owner, spender, amount);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71732049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档