我已经成功地将我的合同部署到 Kaleido,但我无法弄清楚如何正确验证它。这是部署合约的源代码,我已经验证了最后一条打印语句打印的地址出现在我的 Kaleido 区块链中:
从 web3 导入 web3 从 web3.providers 导入 HTTPProvider 从 solc 导入 compile_source # Solidity 源代码 contract_source_code = ''' 编译指示 ^0.4.0; 合同迎宾{ 字符串公共问候语; 功能迎宾员(){ 问候 = '你好'; } 功能 setGreeting(字符串 _greeting)公共 { 问候=_问候; } 函数 greet() 常量返回(字符串){ 回礼; } } ''' compiled_sol = compile_source(contract_source_code) # 编译好的源代码 contract_interface = compiled_sol[':Greeter'] w3 = Web3(HTTPProvider("https://XXXXX:YYYYY@ZZZZZZZ.kaleido.io")) contract_ = w3.eth.contract( abi=contract_interface['abi'], bytecode=contract_interface['bin']) # 注意:与万花筒交互时,gasPrice 必须为 0(我认为是因为我选择的共识算法) # 这似乎与发送自哪个帐户无关 construct_txn = contract_.constructor().buildTransaction({ “来自”:w3.eth.accounts[0], “气体”:1728712, 'gasPrice': 0}) txn = w3.eth.sendTransaction(construct_txn) tx_receipt = w3.eth.getTransactionReceipt(txn) contract_address = tx_receipt['contractAddress'] 打印(合同地址)
当我尝试验证我的合约时,我被要求提供源代码、合约名称、编译器版本以及是否使用了优化。
我将以下内容用于请求的源代码
编译指示 ^0.4.0; 合同迎宾{ 字符串公共问候语; 功能迎宾员(){ 问候 = '你好'; } 功能 setGreeting(字符串 _greeting)公共 { 问候=_问候; } 函数 greet() 常量返回(字符串){ 回礼; } }
我Greeter
用作合同名称。solc --version
我发现的回报Version: 0.4.24+commit.e67f0147.Darwin.appleclang
是在 5 月 16 日提交的:https ://github.com/ethereum/solidity/search?q=e67f0147&type=Commits 。
我已经尝试了以下所有编译器版本 + 启用优化的组合:{0.4.24, 0.4.24-nightly.2018.5.16} x {优化启用,优化禁用} 这些组合都不起作用。当我尝试 0.4.24-nightly.2018.5.16 时出现以下错误,因为未启用编译器和优化:
编译结果与位于 0x4c94e89d5ec3125339906109f143673f40868df2 的输入创建字节码不匹配。 编译失败:[“警告:这是一个预发布的编译器版本,请不要在生产中使用它。\n”,”:6:5:警告:不推荐将构造函数定义为与合约同名的函数。请改用 \"constructor(...) { ... }\"。\n function Greeter() {\n ^(相关源代码部分从这里开始并跨越多行)。\n",":6:5 :警告:未指定可见性。默认为 \"public\"。\n function Greeter() {\n ^(相关源代码部分从此处开始并跨越多行)。\n",":14:5: 警告:未指定可见性。默认为 \"public\"。\n 函数 greet() 常量返回(字符串){\n ^(相关源部分从此处开始并跨越多行)。\n"] 。