ECDSA 사용, 实现多签(一)
2805 단어 ecdsasolidityblockchain
这方面的原理,以及实现我就不讨论了,文章比较多,程序员嘛,除了自己写的代码,就是关注接口,学会要会使用.
文档
내가 사용하는 openzeppelin的实现,大家可以看看这里的文档.
FUNCTIONS
tryRecover(hash, signature)
recover(hash, signature)
tryRecover(hash, r, vs)
recover(hash, r, vs)
tryRecover(hash, v, r, s)
recover(hash, v, r, s)
toEthSignedMessageHash(hash)
toEthSignedMessageHash(s)
toTypedDataHash(domainSeparator, structHash)
加密中比较重要的,私钥,公钥,信息
이름:
验证签名:
代码
直接来个测试用例,说明这个过程,里面的私钥都来自Ganache公开的私钥
,测试用环境用的forge,不会用forge,看这里 forge 入门
function testSign() public {
address alice = address(0x9BEF5148fD530244a14830f4984f2B76BCa0dC58); //alice的公钥
address bob = address(0x8Aa8b0D84cf523923A459a6974C9499581d1F93D); //bob的公钥
bytes32 hash = keccak256("Signed by Alice"); //信息hash值
(uint8 v, bytes32 r, bytes32 s) = sign(
0x18ef5d5e78aa58a63503bcb48a563de61ffe7665d73ee22b4ab66ef15248be5a,
hash
); //使用的alice的私钥、hash进行签名
bytes memory sig = abi.encodePacked(r, s, v); //打包成测试需要的格式
address signer = hash.recover(sig); //使用的ECDSA recover 函数得到签名地址
emit log_named_address("address", signer);
assertEq(alice, signer);
(uint8 v2, bytes32 r2, bytes32 s2) = sign(
0x4e1518672e45fb2746ec5a217330ed24d815d44537da647e973c06d0b0069053,
hash
); //bob的私钥
bytes memory sig2 = abi.encodePacked(r2, s2, v2);
address signer2 = hash.recover(sig2);
emit log_named_address("address", signer2);
assertEq(bob, signer2);
}
就这样,做多签的基础就有了.
下一篇就讲讲怎么做到多签名确认,才能转账.
上面的代码对 forge-std加了一个小函数.
function sign(uint256 pri, bytes32 msg)
public
returns (
uint8,
bytes32,
bytes32
)
{
return vm_std_cheats.sign(pri, msg);
}
更详细的,看我github上的仓库,后面的多签,也会提交到这里:
SimpleMultiSig
Reference
이 문제에 관하여(ECDSA 사용, 实现多签(一)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/xiaodao/ecdsashi-yong-shi-xian-duo-qian--1jkg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)