以太坊合约地址是如何生成的

我们在以太坊上创建一个合约时,新生成的合约的地址是根据发送者(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正是这么做的。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

微信号已复制,请打开微信添加咨询详情!
-->