5

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.

4

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)

| improve this answer | |
  • 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. – Karthikeyan Thangavel Jun 16 '17 at 11:19
  • You may use ABDK Toolkit online tool to calculate contract address before the contract is actually deployed. – Mikhail Vladimirov Jan 24 at 19:01
1

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.

| improve this answer | |
  • 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 7:34
  • How about using an ethereum name service smart contract to resolve .eth addresses? – AKstat Jun 29 '17 at 19:46
0

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 garanteet to have this adress, because the nonce is always the same. https://eips.ethereum.org/EIPS/eip-1820

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

  // deploying a contract with a static adress.
  // 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('transfering 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)
}

| improve this answer | |
-1

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

| improve this answer | |
  • 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" ] } } } ... } github.com/iurimatias/embark-framework#tests – Midhun Mohan Jun 15 '17 at 10:30
  • Please edit your answer instead of commenting. – Afr Jun 15 '17 at 12:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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