12

Is there any method to deploy our smart contract in a particular address (ie. predefined contract address) in private ethereum network?

Yes, I have built my own private blockchain based on Ethereum code. I need to deploy contract on some blocks and I have to send that address to my client ( users). In this scenario, I don't want to send a different address to the client while I am deploying a contract. If it was a static address it will be easy for me. I will just inform them I have deployed a new contract so that they can use the static address to get input for their code.

Karthikeyan Thangavel
  • 1,206
  • 2
  • 12
  • 25
  • If you're using your network to do some sort of technical bookkeeping for clients (read/write data, signals, etc) you can deploy a main contract with mutable fields so that a contract admin can update the data for users to check without having to constantly rotate contracts. But the contract address itself is deterministic, based on deployment variables. You'll know it when deploying but you can't say "in the future I'll be deploying a contract to address A". – jon.bray.eth Dec 09 '23 at 22:25

4 Answers4

14

It is not possible to deploy a contract to an address of your choice

The address a contract is deployed to is generated deterministically using the address of the deployer and the deployer's total number of transactions (the nonce): How is the address of an Ethereum contract computed?

This means you can work out the address of the contract before it is deployed:

var ethJsUtil = require('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
  yourAddress,
  web3.eth.getTransactionCount(yourAddress)));

(from https://stackoverflow.com/a/42416934)

Joe
  • 1,173
  • 1
  • 11
  • 31
7

You are able to deploy contracts with a static address if you are using the account only 1⁻shot. this even works across different ethereum based Blockchains. A nice Method is to Fake the Signature like it is done in ERC 1820 - therefore it is guaranteed to have this address, because the nonce is always the same. https://eips.ethereum.org/EIPS/eip-1820

// Todo: some of the parameters might be calculable out of the raw transaction.
async function deployWithDeterministicAddress(payingAccount, expectedContractAddress, singleUsedCreatorAddress, gasCosts, rawTx) {

// deploying a contract with a static address. // see: https://eips.ethereum.org/EIPS/eip-1820

const gotCode = await web3.eth.getCode(expectedContractAddress);

if (gotCode === '0x') { // contract does not exist, deploy new. console.log('transferring funds for single use account'); await web3.eth.sendTransaction({ from: payingAccount, to: singleUsedCreatorAddress, value: gasCosts}) console.log('creating contract'); const introspectionResult = await web3.eth.sendSignedTransaction(rawTx); console.log('contract got deployed: ', introspectionResult.contractAddress);

if (introspectionResult.contractAddress.toLowerCase() !== expectedContractAddress.toLowerCase()) {
  console.error('MISSMATCH: the expected contract Address did not match the actual contract Address');
}

} else { console.log('skipping: contract already exists'); } }

async function deployEip1820(payingAccount) {

//deploy pseudo-introspection Registry Contract. // see: https://eips.ethereum.org/EIPS/eip-1820 const expectedContractAddress = '0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24'; const singleUsedCreatorAddress = '0xa990077c3205cbDf861e17Fa532eeB069cE9fF96'; const gasCosts = web3.utils.toHex('80000000000000000'); const rawTx = '0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820'

await deployWithDeterministicAddress(payingAccount, expectedContractAddress, singleUsedCreatorAddress, gasCosts, rawTx) }

Throvn
  • 231
  • 1
  • 9
Thomas Haller
  • 91
  • 1
  • 5
3

Your question is a little unclear, but I'll give it a go.

First off, you can deploy a contract to any public address for which you control the private keys. So in that sense, you can generate a keypair and decide to publish a contract to that specific address. The address will be random because that is how key generation works but you will know the address ahead of publishing the contract.

If instead you are asking if you can first pick the public address because you like that number, i.e. 0xdeadbeef..., then no, you would have to by chance generate a public private keypair for that public address, assuming it is a valid address at all.

This last part of your question about a private Ethereum network is a tad confusing. Do you mean running your own private blockchain? Theorhetically if you control the code running on the nodes in your blockchain you can theoretically make it do whatever you want if you can code it. But you are going to be subject to much the same constraints as the main Ethereum blockchain is held to.

AKstat
  • 236
  • 1
  • 4
  • Yes, I have built my own private blockchain based on Ethereum code. I need to deploy contract on some blocks and I have to send that address to my client ( users). In this scenario, I don't want to send a different address to the client while I am deploying a contract. If it was a static address it will be easy for me. I will just inform them I have deployed a new contract so that they can use the static address to get input for their code. – Karthikeyan Thangavel Jun 15 '17 at 07:34
  • How about using an ethereum name service smart contract to resolve .eth addresses? – AKstat Jun 29 '17 at 19:46
-2

You can use Embark framework for this if you are using ethereum on Linux platform https://github.com/iurimatias/embark-framework/wiki/Installation

Midhun Mohan
  • 107
  • 3
  • Could you please tell me how this, answers the questions? – Badr Bellaj Jun 15 '17 at 10:10
  • Contracts addresses can be defined. If an address is defined, Embark uses the defined address instead of deploying the contract.

    config/contracts.json

    { ... "development": { "contracts": { "UserStorage": { "address": "0x123456" }, "UserManagement": { "args": [ "$UserStorage" ] } } } ... }

    https://github.com/iurimatias/embark-framework#tests

    – Midhun Mohan Jun 15 '17 at 10:30
  • Please edit your answer instead of commenting. – q9f Jun 15 '17 at 12:51