在 EIP1820 协议中,为了把ERC1820Registry合约部署在任何以太坊网络(比如:主网和测试网络Ropsten)上时都能使用同一个合约地址,设计了一种巧妙的方法:就是利用ecrocover函数生成一个“一次性使用地址( single use address )”来发起生成ERC1820Registry合约的事务。也就是所谓的Nick’s Method(详见 Nick’s article 一文)。相关部分内容我摘录如下:
ecrecover函数
在Solidity中的函数 ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address) 的作用是从椭圆曲线签名和消息哈希中反算出相应的公钥进而算出地址作为函数的返回值,其中参数:
① hash: 消息的哈希
② r: ECDSA签名值的前32个字节
③ s: ECDSA签名值的紧接着的32个字节
④ v: ECDSA签名值的最后一个字节
在其他语言(比如NodeJS)中的用法也是类似的。
pragma solidity >0.5.0;
contract EcrecoverTest {
function verify(bytes32 hash) public pure returns(address retAddr) {
uint8 v = 27;
bytes32 r = hex"1820182018201820182018201820182018201820182018201820182018201820";
bytes32 s = hex"1820182018201820182018201820182018201820182018201820182018201820";
retAddr= ecrecover(hash, v, r, s);
}
}
以上是Solidity语言实现的一个例子,使用的数值也是EIP 1820 中的数值,便于大家对比验证,在Remix中使用
a50e507019122a7e00e77c401a9c7800debd1e6de5044b5d23cb7cf10f8f9099
作为参数调用verify函数 得到的返回值是
a990077c3205cbDf861e17Fa532eeB069cE9fF96
下图中红色圈圈中的,和上文中的“一次性使用地址( single use address )”完全相同。
EIP1820部署方法验证
按照EIP1820部署方法的5个步骤,我们使用NodeJS和Ganache通过代码逐一进行学习和验证。
var Web3 = require('web3');
//使用Ganache作为测试客户端
var web3 = new We