14

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.

1
  • 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". Commented Dec 9, 2023 at 22:25

4 Answers 4

16

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)

2
  • In my scenario, I know the Senders address and a total number of the transaction. so, In this case, can I able to deploy it. Commented Jun 16, 2017 at 11:19
  • You may use ABDK Toolkit online tool to calculate contract address before the contract is actually deployed. Commented Jan 24, 2020 at 19:01
8

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)
}

1
  • Thank you! makes sense
    – Mila A
    Commented Oct 20, 2023 at 19:51
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.

2
  • 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. Commented Jun 15, 2017 at 7:34
  • How about using an ethereum name service smart contract to resolve .eth addresses?
    – AKstat
    Commented Jun 29, 2017 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

3
  • Could you please tell me how this, answers the questions?
    – Badr Bellaj
    Commented Jun 15, 2017 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" ] } } } ... } github.com/iurimatias/embark-framework#tests Commented Jun 15, 2017 at 10:30
  • Please edit your answer instead of commenting.
    – q9f
    Commented Jun 15, 2017 at 12:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.