Я пытаюсь развернуть контракт через MyEtherWallet из байтового кода, созданного браузерной надежностью . Я разблокировал свой кошелек с помощью закрытого ключа, но не нашел способа передать параметры конструктору контракта. Как я могу это сделать?
Это заставляет меня сомневаться, смогу ли я вызывать все функции моего контракта из MyEtherWallet, как я мог использовать Mist.
Я использую MyEtherWallet в качестве замены для Mist, потому что это спасает меня от загрузки данных блокчейна. Но не уверен, будет ли это работать в качестве замены Mist для развертывания и доступа к контрактам.
Редактировать 1: Даже при развертывании контракта из Mist с использованием байт-кода не дает никакой возможности выбрать контакт и передать параметры контракту. Хотя развертывание контракта из исходного кода работает так же хорошо, как и ожидалось.
Если вы посмотрите документацию Web3 , вы можете получить полный байт-код развертывания с:
var bytecodeWithParam = MyContract.new.getData ( param1, param2, {data: compiledByteCode});
Именно этот bytecodeWithParam
вставляется в поле «Byte Code». Если вы посмотрите на это подробно, вы увидите, что в конце 32-байтовые значения param1
и param2
упакованы.
Используя 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, чтобы развернуть его, например, с его параметрами.
Это действительно вопрос, специфичный для 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, как требуется, если вы не хотите каждый раз возвращаться к компилятору (!).
Прашант Прабхакар Сингх
MyContrac
здесь? Я думаю, что шаги являются частью развертывания контракта из geth. У меня нет geth (или, может быть, если меня не устраивает командная строка). Я скомпилировал свой контракт из solidity-compiler, он дал мне скомпилированный байт-код. Итак, как действовать сейчас?Ксавье Лепретр B9lab
MyContract
с выводом компилятора солидности: github.com/ethereum/wiki/wiki/JavaScript-API#returns-48Дмитрий Зарезенко