Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

bitget新闻:在EIP 1820协议中,为了把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 Web3(new Web3.providers.HttpProvider(''));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

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

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

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

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

Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册