我遇到过开放zepplin中的程712实用程序。我还找到了一份使用草案版本这里的合同。我已经修改了他们的合同,使之更接近我想做的事情。
我很好奇在链上存储一些东西的散列,然后再把它暴露出来。下面的示例代码可以在任何情况下被操作吗?即在用户发现"myParam“之前检索它?
contract MyContract is EIP712 {
mapping(address => bytes32) public digests;
mapping (address => uint256) nonces;
function storeDigest(address owner,
uint256 myParam,
uint256 deadline) {
digests[msg.sender] = _hashTypedDataV4(keccak256(abi.encode(
keccak256("MyFunction(address owner,uint256 myParam,uint256 nonce,uint256 deadline)"),
owner,
myParam,
nonces[owner],
deadline
)));
}
function revealMyParam(
bytes memory signature,
address owner,
uint256 myParam,
uint256 deadline
) external {
bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
keccak256("MyFunction(address owner,uint256 myParam,uint256 nonce,uint256 deadline)"),
owner,
myParam,
nonces[owner],
deadline
)));
require(digests[msg.sender] == digest, "different digest")
address signer = ECDSA.recover(digests[msg.sender], signature);
require(signer == owner, "MyFunction: invalid signature");
require(signer != address(0), "ECDSA: invalid signature");
require(block.timestamp < deadline, "MyFunction: signed transaction expired");
nonces[owner]++;
_doSomethingWithMyParamSinceItIsNowRevealed(owner, myParam);
}
}发布于 2021-10-12 07:06:53
我会说是的,在揭发之前可以揭发。契约本身是很好的,但是当用户调用storeDigest时,myParam属性在内存池/稍后的以太扫描中是公开可见的。因此,如果攻击者能够找到存储的tx,他/她就可以看到普通的param值。
也许您想要创建散列链,并将其传递给合同。然后,在显示阶段,发送普通值,并让契约将原始哈希(从存储阶段)与来自纯值的计算哈希进行比较。您可以在提交-显示模式下找到更多关于此主题的信息,该模式用于链上投票。
https://ethereum.stackexchange.com/questions/111419
复制相似问题