Ethereum Kaleido虚拟机处于只读模式

Ethereum Kaleido虚拟机处于只读模式,ethereum,kaleido,Ethereum,Kaleido,我已在Kaleido上成功部署了以下合同: pragma solidity ^0.4.0; contract Greeter { string public greeting; function Greeter() { greeting = 'Hello'; } function setGreeting(string _greeting) public { greeting = _greeting; } fu

我已在Kaleido上成功部署了以下合同:

pragma solidity ^0.4.0; contract Greeter { string public greeting; function Greeter() { greeting = 'Hello'; } function setGreeting(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } } pragma-solidity^0.4.0; 合同迎宾员{ 串公共问候语; 函数Greeter(){ 问候语=‘你好’; } 函数setGreeting(字符串_greeting)public{ 问候语=_问候语; } 函数greet()常量返回(字符串){ 回敬问候; } } 我试着这样与合同互动:

from web3 import Web3 from web3.providers import HTTPProvider from solc import compile_source from web3.contract import ConciseContract # Solidity source code contract_source_code = ''' pragma solidity ^0.4.0; contract Greeter { string public greeting; function Greeter() { greeting = 'Hello'; } function setGreeting(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } } ''' compiled_sol = compile_source(contract_source_code) contract_interface = compiled_sol[':Greeter'] w3 = Web3(HTTPProvider("https://user:password@u0telyzine-u0od4ny83j-rpc.us-east-2.kaleido.io")) # address from previous deployment contract_address = Web3.toChecksumAddress("0x4c94e89d5ec3125339906109f143673f40868df2") greeter = w3.eth.contract( address=contract_address, abi=contract_interface['abi'], ) print('Default contract greeting: {}'.format( greeter.functions.greet().call() )) # --- this hangs --- print('Setting the greeting to Nihao...') tx_hash = greeter.functions.setGreeting('Nihao').transact({ 'from': w3.eth.accounts[0], 'gas': 100000}) w3.eth.waitForTransactionReceipt(tx_hash) print('Updated contract greeting: {}'.format( greeter.functions.greet().call() )) reader = ConciseContract(greeter) assert reader.greet() == "Nihao" 从web3导入web3 从web3.providers导入HTTPProvider 从solc导入编译源代码 从web3.contract导入简明合同 #稳定源代码 合同\源\代码=“” pragma-solidity^0.4.0; 合同迎宾员{ 串公共问候语; 函数Greeter(){ 问候语=‘你好’; } 函数setGreeting(字符串_greeting)public{ 问候语=_问候语; } 函数greet()常量返回(字符串){ 回敬问候; } } ''' compiled\u sol=compile\u source(合同源代码) 合同\接口=已编译的\ sol[':问候者'] w3=Web3(HTTPProvider(“https://user:password@u0telyzine-u0od4ny83j-rpc.us-east-2.kaleido.io”)) #来自上一次部署的地址 合同地址=Web3.toChecksumAddress(“0x4c94e89d5ec3125339906109f143673f40868df2”) 迎宾员=w3.eth.contract( 地址=合同地址, abi=合同界面['abi'], ) 打印('默认合同问候语:{}'。格式( greeter.functions.greet().call() )) #---这个挂着--- 打印('将问候语设置为Nihao…') tx_hash=greeter.functions.setGreeting('Nihao').transact({'from':w3.eth.accounts[0],'gas':100000}) w3.eth.waitForTransactionReceipt(tx_哈希) 打印('更新的合同问候语:{}'。格式( greeter.functions.greet().call() )) 读卡器=礼宾合同(接线员) 断言reader.greet()=“Nihao” 但是,当我尝试提交一个调用
setGreeting
的事务时,该事务将挂起。查看Kaleido日志,我看到
VM处于只读模式。禁止变异操作码
。此外,当我访问节点的块资源管理器时,当块加载时,事务不会加载

对于此只读模式,我可以做些什么?

moghadasian

“VM处于只读模式”是因为您正在使用
call
与智能合约方法交互。所以它只是以只读模式调用您的方法。您可以使用它来调用查询数据的合同上的方法,而不必向链提交事务

[edit]-上述建议通常对“只读模式下的虚拟机”很有帮助,但如果您正在试用python web3,您可能需要另一个完整的工作示例:[/edit]

尊敬的Peter,moghadasian

“VM处于只读模式”是因为您正在使用
call
与智能合约方法交互。所以它只是以只读模式调用您的方法。您可以使用它来调用查询数据的合同上的方法,而不必向链提交事务

[edit]-上述建议通常对“只读模式下的虚拟机”很有帮助,但如果您正在试用python web3,您可能需要另一个完整的工作示例:[/edit]

你好,彼得

在提交事务时,我无法重新创建您的“只读模式下的VM”-该操作成功。 然而,为了让web3/python连接到Kaleido,我不得不做一些调查——所以我添加了一个单独的答案,以帮助其他试图开始的人

从Python web3配置对Kaleido的HTTPS身份验证 在我的Mac上,使用默认的pip3安装web3,我发现使用auth配置Python会话的唯一方法是使用
$HOME/.netrc
文件,例如:

machine u0oaXXXXXX-u0c4XXXXXX-rpc.us-east-2.kaleido.io
login u0d0bxXXXX
password jA-pJdIrcRaIx7XXXXXXXXXXXXXXXXXXXXXXXXX
为Geth/PoA配置web3 我的链使用Geth/PoA,因此我必须按照此处的说明安装所需的中间件:

更新的示例,包括合同的部署 下面是成功部署并报告了更新的契约问候语:Nihao的python3。 您需要将
HTTPProvider
更改为节点的HTTPS RPC URL,但不带身份验证头

from web3 import Web3
from web3.providers import HTTPProvider
from solc import compile_source
from web3.contract import ConciseContract
from web3.middleware import geth_poa_middleware

# Solidity source code
contract_source_code = '''
pragma solidity ^0.4.0;

contract Greeter {
    string public greeting;

    function Greeter() {
        greeting = 'Hello';
    }

    function setGreeting(string _greeting) public {
        greeting = _greeting;
    }

    function greet() constant returns (string) {
        return greeting;
    }
}
'''

compiled_sol = compile_source(contract_source_code) 
contract_interface = compiled_sol['<stdin>:Greeter']

w3 = Web3(HTTPProvider("https://u0oaXXXXXX-u0c4XXXXXX-rpc.us-east-2.kaleido.io"))
w3.middleware_stack.inject(geth_poa_middleware, layer=0)

Greeter = w3.eth.contract(abi=contract_interface['abi'], bytecode=contract_interface['bin'])
tx_hash = Greeter.constructor().transact({ 'from': w3.eth.accounts[0], 'gas': 1000000})
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
print('Deployed greeter contract: {}'.format(tx_receipt.contractAddress))

# address from previous deployment
contract_address = Web3.toChecksumAddress(tx_receipt.contractAddress)

greeter = w3.eth.contract(
    address=contract_address,
    abi=contract_interface['abi'],
)

print('Default contract greeting: {}'.format(
    greeter.functions.greet().call()
))

print('Setting the greeting to Nihao...')
tx_hash = greeter.functions.setGreeting('Nihao').transact({ 'from': w3.eth.accounts[0], 'gas': 100000})

w3.eth.waitForTransactionReceipt(tx_hash)

print('Updated contract greeting: {}'.format(
    greeter.functions.greet().call()
))

reader = ConciseContract(greeter)
assert reader.greet() == "Nihao"
从web3导入web3
从web3.providers导入HTTPProvider
从solc导入编译源代码
从web3.contract导入简明合同
从web3.0中间件导入geth_poa_中间件
#稳定源代码
合同\源\代码=“”
pragma-solidity^0.4.0;
合同迎宾员{
串公共问候语;
函数Greeter(){
问候语=‘你好’;
}
函数setGreeting(字符串_greeting)public{
问候语=_问候语;
}
函数greet()常量返回(字符串){
回敬问候;
}
}
'''
compiled\u sol=compile\u source(合同源代码)
合同\接口=已编译的\ sol[':问候者']
w3=Web3(HTTPProvider(“https://u0oaXXXXXX-u0c4XXXXXX-rpc.us-east-2.kaleido.io"))
w3.middleware\u stack.inject(geth\u poa\u middleware,layer=0)
Greeter=w3.eth.contract(abi=contract\u接口['abi'],字节码=contract\u接口['bin'])
tx_hash=Greeter.constructor().transact({'from':w3.eth.accounts[0],'gas':1000000})
tx_receive=w3.eth.waitforTransactionReceive(tx_散列)
打印('Deployed greeter contract:{}'。格式(tx_receive.contractAddress))
#来自上一次部署的地址
合同地址=Web3.toChecksumAddress(tx\u receive.contractAddress)
迎宾员=w3.eth.contract(
地址=合同地址,
abi=合同界面['abi'],
)
打印('默认合同问候语:{}'。格式(
greeter.functions.greet().call()
))
打印('将问候语设置为Nihao…')
tx_hash=greeter.functions.setGreeting('Nihao').transact({'from':w3.eth.accounts[0],'gas':100000})
w3.eth.waitForTransactionReceipt(tx_哈希)
打印('更新的合同问候语:{}'。格式(
greeter.functions.greet().call()
))
读卡器=礼宾合同(接线员)
断言reader.greet()=“Nihao”
moghadasian

提交transac时,我无法重新创建您的“只读模式VM”