我已经在 Kaleido 上成功部署了以下合约:
编译指示 ^0.4.0; 合同迎宾{ 字符串公共问候语; 功能迎宾员(){ 问候 = '你好'; } 功能 setGreeting(字符串 _greeting)公共 { 问候=_问候; } 函数 greet() 常量返回(字符串){ 回礼; } }
我尝试像这样与合同进行交互:
从 web3 导入 web3 从 web3.providers 导入 HTTPProvider 从 solc 导入 compile_source 从 web3.contract 导入 ConciseContract # Solidity 源代码 contract_source_code = ''' 编译指示 ^0.4.0; 合同迎宾{ 字符串公共问候语; 功能迎宾员(){ 问候 = '你好'; } 功能 setGreeting(字符串 _greeting)公共 { 问候=_问候; } 函数 greet() 常量返回(字符串){ 回礼; } } ''' 已编译溶胶 = 编译源(合同源代码) contract_interface = compiled_sol[':Greeter'] w3 = Web3(HTTPProvider("https://user:password@u0telyzine-u0od4ny83j-rpc.us-east-2.kaleido.io")) # 之前部署的地址 contract_address = Web3.toChecksumAddress("0x4c94e89d5ec3125339906109f143673f40868df2") 迎宾员 = w3.eth.contract( 地址=合约地址, abi=contract_interface['abi'], ) print('默认合同问候语:{}'.format( greeter.functions.greet().call() )) # --- 这挂了 --- print('设置问候你好...') tx_hash = greeter.functions.setGreeting('Nihao').transact({'from': w3.eth.accounts[0], 'gas': 100000}) w3.eth.waitForTransactionReceipt(tx_hash) print('更新的合同问候语:{}'.format( greeter.functions.greet().call() )) 读者 = ConciseContract(问候语) 断言 reader.greet() == "你好"
但是,当我尝试提交调用setGreeting
该事务的事务时挂起。查看 Kaleido 日志,我看到了VM in read-only mode. Mutating opcode prohibited
。此外,当我访问节点的区块浏览器时,交易不会在区块加载时加载。
我可以对这种只读模式做些什么?