首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOMAIN_SEPARATOR in EIP712是什么?

DOMAIN_SEPARATOR in EIP712是什么?
EN

Ethereum用户
提问于 2022-03-31 11:34:29
回答 2查看 2.3K关注 0票数 7

能否有人向我解释一下DOMAIN_SEPARATOR在EIP712中的使用,以及它如何确保同一用户在两个不同的Dapps中对相同的消息进行不同的签名?

EN

回答 2

Ethereum用户

发布于 2022-03-31 11:39:23

这是每个域“混合”签名的唯一值。它使来自不同域的签名不兼容,因为它被设计为包含一些DApp唯一信息,例如DApp的名称、预期的验证器契约地址、预期的DApp域名等。

来源:https://eips.ethereum.org/EIPS/eip-712

票数 6
EN

Ethereum用户

发布于 2022-11-10 01:44:05

有可能是两个DApps提出了一个相同的结构,如传输(地址,地址到,uint256数量),不应该兼容。通过引入域分隔符,可以保证dApp开发人员不会出现签名冲突。

您可以看到Uniswap如何在ERC721Permit.sol中使用它的一个实际示例。

代码语言:javascript
复制
   function DOMAIN_SEPARATOR() public view override returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)')
                    0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f,
                    nameHash,
                    versionHash,
                    ChainId.get(),
                    address(this)
                )
            );
    }

DOMAIN_SEPARATOR返回一个哈希值(bytes32),这是在permit函数中使用的哈希值。

代码语言:javascript
复制
   function permit(
        address spender,
        uint256 tokenId,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable override {
        require(_blockTimestamp() <= deadline, 'Permit expired');
        // it is used to create another hash value to make it unique
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR(),
                keccak256(abi.encode(PERMIT_TYPEHASH, spender, tokenId, _getAndIncrementNonce(tokenId), deadline))
            )
        );
        address owner = ownerOf(tokenId);
        require(spender != owner, 'ERC721Permit: approval to current owner');

        if (Address.isContract(owner)) {
            require(IERC1271(owner).isValidSignature(digest, abi.encodePacked(r, s, v)) == 0x1626ba7e, 'Unauthorized');
        } else {
            address recoveredAddress = ecrecover(digest, v, r, s);
            require(recoveredAddress != address(0), 'Invalid signature');
            require(recoveredAddress == owner, 'Unauthorized');
        }

        _approve(spender, tokenId);
    }
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/125128

复制
相关文章

相似问题

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