यहाँ एक न्यूनतम (कॉपी और पेस्ट) उदाहरण दिया गया है कि Foundry वातावरण में OpenZeppelin के साथ सुरक्षित रूप से ECDSA signatures कैसे बनाएँ और verify करें।
Contract: Verifier.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
contract Verifier {
using ECDSA for bytes32;
address public verifyingAddress;
constructor(address _verifyingAddress) {
verifyingAddress = _verifyingAddress;
}
function verifyV1(
string calldata message,
bytes32 r,
bytes32 s,
uint8 v
) public view {
bytes32 signedMessageHash = keccak256(abi.encode(message))
.toEthSignedMessageHash();
require(
signedMessageHash.recover(v, r, s) == verifyingAddress,
"signature not valid v1"
);
}
function verifyV2(
string calldata message,
bytes calldata signature
) public view {
bytes32 signedMessageHash = keccak256(abi.encode(message))
.toEthSignedMessageHash();
require(
signedMessageHash.recover(signature) == verifyingAddress,
"signature not valid v2"
);
}
}
Test (Verifier.t.sol)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "forge-std/Test.sol";
import "../src/Verify.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "forge-std/console.sol";
contract TestSigs1 is Test {
using ECDSA for bytes32;
Verifier verifier;
address owner;
uint256 privateKey =
0x1010101010101010101010101010101010101010101010101010101010101010;
function setUp() public {
owner = vm.addr(privateKey);
verifier = new Verifier(owner);
}
function testVerifyV1andV2() public {
string memory message = "attack at dawn";
bytes32 msgHash = keccak256(abi.encode(message))
.toEthSignedMessageHash();
(uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, msgHash);
bytes memory signature = abi.encodePacked(r, s, v);
assertEq(signature.length, 65);
console.logBytes(signature);
verifier.verifyV1(message, r, s, v);
verifier.verifyV2(message, signature);
}
}
यह तब भी काम करेगा यदि आप डेटा प्रकार को “string” से बदलकर कुछ और कर देते हैं।
ध्यान दें कि OpenZeppelin signature को प्रस्तुत करने के दो तरीकों का समर्थन करता है। आमतौर पर bytes संस्करण का उपयोग करना अधिक सुविधाजनक होता है क्योंकि पास करने के लिए यह केवल एक अतिरिक्त डेटा होता है। हालाँकि ध्यान दें कि ERC20-Permit तीन-भाग वाले signature (r, s, v) का उपयोग करता है।
अधिक जानें
इस लेख का उपयोग हमारे Solidity Bootcamp में संदर्भ सामग्री के रूप में किया जाता है।
हमारे पास एक मुफ्त learn solidity ट्यूटोरियल भी है।
मूल रूप से 8 मार्च, 2023 को प्रकाशित