Передача аргументов конструктора при развертывании контракта из байтового кода

Я пытаюсь развернуть контракт через MyEtherWallet из байтового кода, созданного браузерной надежностью . Я разблокировал свой кошелек с помощью закрытого ключа, но не нашел способа передать параметры конструктору контракта. Как я могу это сделать?

Это заставляет меня сомневаться, смогу ли я вызывать все функции моего контракта из MyEtherWallet, как я мог использовать Mist.
Я использую MyEtherWallet в качестве замены для Mist, потому что это спасает меня от загрузки данных блокчейна. Но не уверен, будет ли это работать в качестве замены Mist для развертывания и доступа к контрактам.

Редактировать 1: Даже при развертывании контракта из Mist с использованием байт-кода не дает никакой возможности выбрать контакт и передать параметры контракту. Хотя развертывание контракта из исходного кода работает так же хорошо, как и ожидалось.

Ответы (4)

Если вы посмотрите документацию Web3 , вы можете получить полный байт-код развертывания с:

  var bytecodeWithParam = MyContract.new.getData (
     param1,
     param2,
     {data: compiledByteCode});

Именно этот bytecodeWithParam вставляется в поле «Byte Code». Если вы посмотрите на это подробно, вы увидите, что в конце 32-байтовые значения param1 и param2 упакованы.

Что такое MyContrac здесь? Я думаю, что шаги являются частью развертывания контракта из geth. У меня нет geth (или, может быть, если меня не устраивает командная строка). Я скомпилировал свой контракт из solidity-compiler, он дал мне скомпилированный байт-код. Итак, как действовать сейчас?
Вот как вы создаете MyContract с выводом компилятора солидности: github.com/ethereum/wiki/wiki/JavaScript-API#returns-48
Почему я должен использовать web3.js? Например, я скомпилировал свой контракт с трюфелем и хочу развернуть его с помощью MyEtherWallet. Как передать параметры конструктору контрактов?

Используя ethereumlib-js создайте транзакцию без адреса.

Поле данных будет: <smartcontract code><parameters of constructor>

<parameters of constructor> будут закодированы как https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#argument-encoding

Например, код контракта:

 pragma solidity ^0.4.4; contract User { uint age; function User(uint _age) public { age = _age; } } 

Скомпилируйте его, получите двоичный код:

 0x60606040523415600e57600080fd5b5b60016000555b5b60368060236000396000f30060606040525b600080fd00a165627a7a72305820320c27c3dd64a117b2c58da94ee3ac9ad9ae923fa87b4e9ed89a7291dd16b7430029 

Создать транзакцию:

 var EthereumTx = require('ethereumjs-tx'); var privateKey = Buffer.from('xxyyzz', 'hex'); const txParams = { nonce: '0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2DC6C0', data: '0x60606040523415600e57600080fd5b604051602080606f833981016040528080519150505b60008190555b505b60368060396000396000f30060606040525b600080fd00a165627a7a72305820ad0318d19ac274c1f3db9f2953f4631a745431e13641a6f5ca294cf9fb8ba3fc00290000000000000000000000000000000000000000000000000000000000000001' } const tx = new EthereumTx(txParams) tx.sign(privateKey) const serializedTx = tx.serialize(); console.log(serializedTx.toString('hex')); 

Нажмите raw-транзакции в сети. Выполнено :)

Если вы используете более новую версию web3 (например, версию 1.0.0):

  // example solidity code function ContractName(address _arg1, uint256 _arg2, uint256 _arg3) public { arg1 = _arg1; arg2 = _arg2; arg3 = _arg3; } 

Используйте web3.eth.abi.encodeParameter () или web3.eth.abi.encodeParameters (), чтобы закодировать ваши параметры и объединить их в конце вашего байт-кода.

 const Web3 = require("web3"); const solc = require("solc"); // compile the solidity code let compiled = solc.compile(source); // save public interface of contract let abi = JSON.parse(compiled.contracts[":ContractName"].interface) // create var with contract let CrowdFunding = new web3.eth.Contract(abi); let bytecodeWithParameters = compiled.contracts[':ContractName'].bytecode + web3.eth.abi.encodeParameters(['address', 'uint256', 'uint256'], ['0x08cf02070bb9f167556c677da58e6678bbe871fc', '100000000000000000', '10000']).slice(2); // slice(2) because we want to remove the '0x' at the beginning. 

Теперь вы можете ввести bytecodeWithParameters на https://www.myetherwallet.com/#contracts, чтобы развернуть его, например, с его параметрами.

"Одер"? Sprechen Sie Deutsch? :)
Ja, Sowas Passiert Manchmal;)

Это действительно вопрос, специфичный для MyEtherWallet.

Развертывание контракта через MyEtherWallet просто передает байт-код, и нет смысла вводить ваши параметры.

Таким образом, в основном, чтобы использовать MyEtherWallet для этого, вы должны жестко закодировать значения параметров в ваш источник, прежде чем компилировать его в байт-код.

Таким образом, для стандартного контракта Ballot, чтобы иметь 5 предложений в контракте ... Сделайте существующий параметризованный конструктор частной функцией, добавьте новый конструктор без параметров, который вызывает его с набором параметров ...

Это не идеально, но достаточно ясно и выполняет свою работу!

  // Parameterless constructor - 5 proposals constructor() public { construct_ballot(5); } /// Create a new ballot with $(_numProposals) different proposals. function construct_ballot (uint8 _numProposals) private { chairperson = msg.sender; voters[chairperson].weight = 1; proposals.length = _numProposals; } 

Затем вырежьте и вставьте байт-код из выбранного вами инструмента компилятора в MyEtherWallet.

пс. Я полагаю, что вы можете найти '5' (или каковы бы ни были ваши параметры) в байт-коде и вручную отредактировать текстовое поле байт-кода MyEtherWallet, как требуется, если вы не хотите каждый раз возвращаться к компилятору (!).