我已经在 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。此外,当我访问节点的区块浏览器时,交易不会在区块加载时加载。
我可以对这种只读模式做些什么?
