我试图在前端使用_signTypedData(etherjs)对nft数据进行编码,如下所示
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);我将凭证和签名存储在mongo数据库中,我已经在硬帽上部署了智能契约,我正在使用ECDSA.recover查看凭证的签名者来验证签名的真实性。
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);
}但是这样做的结果与实际的签字人并不匹配。我想我在上面使用的散列函数中犯了一些错误。
0xe8c795f9168269940b31a470ad82e89a453e88b9 signer
0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 owner下面是哈希函数。
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
发布于 2022-04-27 08:27:12
这是erc20permit的例子,希望能对你有所帮助。
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);
}https://stackoverflow.com/questions/71732049
复制相似问题