【问题标题】:Deploy contract made with OpenZeppelin from Web3.py从 Web3.py 部署使用 OpenZeppelin 制作的合约
【发布时间】:2019-04-20 09:04:25
【问题描述】:

我学习了一个以创建 ICO 和 Crowdsale 为中心的教程(基于我创建的 ICO)。

我知道这是一个非常经典的教程,但现在我正在将 Django 平台中借助 OpenZeppelin 和 Truffle 框架制作的 2 个合约与 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()

我还在 Ganache 区块链模拟器中初始化了 Coin 合约。

但现在我不知道如何在区块链中部署 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()

此部署会产生 ganache 错误:

处理事务还原时出现错误 vm 异常

任何想法如何在 web3.py 中正确部署?


作为参考,这里是使用 Truffle 框架部署众筹代码的成功代码:

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

【问题讨论】:

  • 为什么你不能使用与硬币合约相同的代码?我看不出它不起作用的原因?还是我错过了什么?
  • 我在构造函数中插入了这个参数:tx_hash_prova = contract.constructor(11, 11, 1, w3.eth.accounts[1], tx_receipt.contractAddress).transact(),最后一个参数是硬币合约的地址,然后我在部署时遇到错误
  • 错误涉及ganache区块链模拟器,提示:error vm exception while processing transaction revert
  • 尝试按照这个答案的说明进行操作。这是一种略有不同的方法。 ethereum.stackexchange.com/questions/44614/…

标签: python ethereum web3 truffle openzeppelin


【解决方案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)

【讨论】:

  • 感谢您的建议,我已经为硬币部署编写了新行:` tx_hash = contract_coin.constructor().transact() tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)` 但是我不知道我要介绍众筹的构造,我已将地址作为最后一个参数插入,但 ganache 的 vm 继续崩溃
猜你喜欢
  • 2022-11-15
  • 2020-10-04
  • 2020-08-26
  • 2020-03-09
  • 2019-12-26
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多