以太坊生成地址_在以太坊中如何把智能合约部署到预定的地址

EIP 1820协议中,为了把ERC1820Registry合约部署在任何以太坊网络(比如:主网和测试网络Ropsten)上时都能使用同一个合约地址,设计了一种巧妙的方法:就是利用ecrocover函数生成一个“一次性使用地址( single use address )”来发起生成ERC1820Registry合约的事务。也就是所谓的Nick’s Method(详见 Nick’s article 一文)。相关部分内容我摘录如下:

c259bdeeb9ed7d3a9605ce8818afed62.png

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 )”完全相同。

f7639eefbfd268c578dc636ebbbbfc88.png

EIP1820部署方法验证

按照EIP1820部署方法的5个步骤,我们使用NodeJS和Ganache通过代码逐一进行学习和验证。

var Web3 = require('web3');//使用Ganache作为测试客户端var web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:7545/'));var util = require('ethereumjs-util');var tx = require('ethereumjs-tx');/* ===========================================================================1. Generate a transaction which deploys the contract from a new random account    随便使用一个账号部署ERC1820Registry合约,获得Raw Transaction数据,文中已经给出了Raw Transaction数据,并且必须是使用这个数据。===========================================================================  */const erc1820rawData = "0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820";var erc1820Tx = new tx(erc1820rawData);//console.log(erc1820Tx.toJSON(true)); //获得消息哈希var msgHash = erc1820Tx.hash(false);    //a50e507019122a7e00e77c401a9c7800debd1e6de5044b5d23cb7cf10f8f9099/* ===========================================================================2. Set the v, r, s of the transaction signature to the following values3. We recover the sender of this transaction, i.e., the single-use deployment account.   ===========================================================================  *///获得发送者地址方法一:使用ecrecover函数获得公钥和发送者地址var senderPubKey = util.ecrecover(msgHash,27,'0x1820182018201820182018201820182018201820182018201820182018201820','0x1820182018201820182018201820182018201820182018201820182018201820');var singleUseAddr1 = util.pubToAddress(senderPubKey);  //a990077c3205cbdf861e17fa532eeb069ce9ff96//获得发送者地址方法二:更加便捷,内部逻辑和方法一相同var singleUseAddr2 = erc1820Tx.getSenderAddress().toString("hex");/* ===========================================================================4. Send exactly 0.08 ether to this single-use deployment account.   ===========================================================================  */web3.eth.sendTransaction({ from: web3.eth.accounts[0], to: singleUseAddr1.toString('hex'), value: web3.toBigNumber('80000000000000000') });/* ===========================================================================5. Broadcast the deployment transaction.===========================================================================  */web3.eth.sendRawTransaction(erc1820rawData, function(err, hash) {    if (!err)        console.log(hash);    else         console.log(err);});console.log("OK");

执行完成得到的事务Hash:

0xfefb2da535e927b85fe68eb81cb2e4a5827c905f78381a01ef2322aa9b0aee8e

d342b99e9d710f91013e033493817ea2.png

在Ganache中找到这个事务,From和To地址和ERC1820中所述完全相同。

f7ac377f25e99b6f59e37f3a049cd03f.png

我们以EIP 1820 协议中的部署ERC1820Registry合约为例来进行说明和演示,更容易比照和学习,但是把智能合约部署到预定的地址的方法和原理相同的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值