Развернуть контракт, заключенный с OpenZeppelin из Web3.py

Я следил за учебником, посвященным созданию ICO и Crowdsale (на основе созданного мной ICO).

Я знаю, что это очень классический учебник, но теперь я интегрирую 2 контракта, созданные с помощью OpenZeppelin и Truffle framework на платформе Django с библиотекой Web3.py, и у меня возникает проблема.

Я скомпилировал исходники контракта с помощью solc и получил файлы abi и bin.

Я открыл такие файлы в python

with open("reservations/contracts/compiled/GustavoCoin.abi") as contract_abi_file_coin:
    contract_abi_coin = json.load(contract_abi_file_coin)

with open("reservations/contracts/compiled/GustavoCoin.bin") as contract_bin_file_coin:
    contract_bytecode_coin = '0x' + contract_bin_file_coin.read()

with open("reservations/contracts/compiled/GustavoCoin.abi") as contract_abi_file:
    contract_abi = json.load(contract_abi_file)

with open("reservations/contracts/compiled/GustavoCoinCrowdsale.bin") as contract_bin_file:
    contract_bytecode = '0x' + contract_bin_file.read()

Я также инициализировал контракт Coin в эмуляторе блокчейна Ganache.

Но теперь я не знаю, как развернуть контракт Crowdsale в блокчейне.

Вот успешный код для развертывания монеты:

contract_coin = w3.eth.contract(abi=contract_abi_coin, bytecode=contract_bytecode_coin)

tx_param = {
    'from': w3.eth.accounts[1],
    'gasPrice': 2000,
}
tx_hash = contract_coin.deploy(transaction=tx_param)

Вот код ошибки для развертывания контракта краудсейла:

construct_crowdsale = contract.constructor(11, 11, 1, w3.eth.accounts[1], tx_receipt.contractAddress)
crowdsale_txn_hash = construct_crowdsale.transact()

Это развертывание генерирует ошибку ганаша:

ошибка vm исключение при обработке возврата транзакции

Есть идеи, как правильно развернуть в web3.py?


В качестве ориентира вот успешный код для развертывания кода краудсейла с фреймворком Truffle:

return deployer
    .then(() => {
        return deployer.deploy(GustavoCoin);
    })
    .then(() => {
        return deployer.deploy(
            GustavoCoinCrowdsale,
            openingTime,
            closingTime,
            rate,
            wallet,
            GustavoCoin.address
        );
    });
};

person Flamel    schedule 17.11.2018    source источник
comment
Почему бы вам просто не использовать тот же код, который вы использовали для контракта на монеты? Я не вижу причины, по которой это не сработает? Или я что-то упускаю?   -  person nikos fotiadis    schedule 18.11.2018
comment
Я вставил эти параметры в конструктор: tx_hash_prova = contract.constructor(11, 11, 1, w3.eth.accounts[1], tx_receipt.contractAddress).transact(), последний параметр - это адрес контракта монеты, затем при его развертывании возникает ошибка   -  person Flamel    schedule 18.11.2018
comment
Ошибка связана с эмулятором блокчейна ganache, который говорит: error vm exception при обработке возврата транзакции   -  person Flamel    schedule 18.11.2018
comment
Попробуйте следовать инструкциям по этому ответу. Это немного другой подход. ethereum.stackexchange.com/questions/44614/   -  person nikos fotiadis    schedule 18.11.2018


Ответы (1)


При отправке развертывания не забудьте указать важные поля транзакции. Например, вы можете установить учетную запись, с которой должна быть подписана транзакция. Это означает замену текущей строки:

crowdsale_txn_hash = construct_crowdsale.transact()

с новыми строками:

tx_param = {
    'from': w3.eth.accounts[1],
    'gasPrice': 2000,
}
crowdsale_txn_hash = construct_crowdsale.transact(tx_param)

Обратите внимание, что это аналогично тому, как отправитель был установлен в контракте монеты (с использованием более старого deploy() API):

tx_param = {
    'from': w3.eth.accounts[1],
    'gasPrice': 2000,
}
tx_hash = contract_coin.deploy(transaction=tx_param)
person carver    schedule 19.11.2018
comment
Спасибо, что посоветовали мне, я написал новые строки для развертывания монеты: `tx_hash = contract_coin.constructor (). Transact () tx_receipt = w3.eth.waitForTransactionReceipt (tx_hash)`, но я не знаю, что я должен ввести построение краудсейла, я вставил адрес в качестве последнего параметра, но виртуальная машина ganache продолжает сбой - person Flamel; 20.11.2018