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

  • Post author:
  • Post category:其他


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

正是这么做的。



版权声明:本文为wumingzhifu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。