我们在以太坊上创建一个合约时,新生成的合约的地址是根据发送者(sender)的地址和其已生成的事务数(nonce)确定的,经过RLP编码后再Hash( Keccak-256)运算得出的。具体的NodeJS代码如下:
var util = require('ethereumjs-util');
//根据发送者地址和nonce求取生成的新合约的地址
//方法一:先RLP编码,再Hash,截取Hash值的后20个字节
var sender = "a990077c3205cbDf861e17Fa532eeB069cE9fF96";
var nonce = 0;
//由于RLP编码规则,当nonce==0时,RLP编码要使用null
var buf = [Buffer.from(sender, "hex"), nonce == 0 ? null : nonce];
var addr1 = util.sha3(util.rlp.encode(buf)).toString("hex").slice(-40);
console.log(addr1);
//方法二
var addr2 = util.generateAddress(Buffer.from(sender, "hex"), nonce).toString("hex");
console.log(addr2);
假设(sender = "a990077c3205cbDf861e17Fa532eeB069cE9fF96")时,运行的结果如下:nonce=0,1820a4b7618bde71dce8cdc73aab6c95905fad24
nonce=1,7faad426db1e8a79173400c5e0914b28f9ff4412
nonce=2,74e474ba81c7d71f23ca9165113b84ed25b82bb0
也就是说合约的地址是可以预先获知的,这有时候很有用。比如:当我们想把一个合约部署到一个固定的地址上时,我们可以通过使用指定的sender和nonce就可以做得到。比如:EIP1820和EIP 2470正是这么做的。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。