Ich versuche, eine Funktion aufzurufen, die die Länge eines globalen Speicherarrays ändert.
Zuerst dachte ich, dass das Problem mit dem Versuch der Änderung der Array-Länge zusammenhängt.
Aber ich habe endlich erkannt, dass es mit der Art und Weise zusammenhängt, wie ich es via aufrufe web3
.
Hier wird eine ähnliche Frage gestellt , die jedoch nicht den web3
verwendeten Code enthält, sodass ich keine richtige Korrelation zwischen der Antwort darauf und dem Problem in meinem Code herstellen kann.
Hier ist mein Python-Code:
from web3 import Web3
from web3 import RPCProvider
from json import loads
eth = Web3(RPCProvider()).eth
abi = open('Test.abi').read()
bin = open('Test.bin').read()
contract = eth.contract(abi=loads(abi),bytecode=bin)
tx_hash = contract.deploy(transaction={'from':eth.accounts[0]})
address = eth.getTransactionReceipt(tx_hash)['contractAddress']
module = contract(address).call()
print(module.getLength()) # prints 0
module.setLength(1)
print(module.getLength()) # prints 0
Und hier ist mein Solidity-Code:
pragma solidity ^0.4.18;
contract Test {
uint8[] private arr;
function Test() public {
}
function setLength(uint256 length) public {
arr.length = length;
}
function getLength() public constant returns (uint256) {
return arr.length;
}
}
Danke schön.
module
im Code der Frage wird immer nur "anrufen". Wenn Sie den Status ändern möchten, müssen Sie eine Transaktion durchführen . In web3.py sieht das so aus:
mycontract = contract(address)
mycontract.transact({... your transaction parameters ...}).setLength(1)
Nachdem Sie darauf gewartet haben, dass die Transaktion abgebaut wird, getLength()
wird der neue Wert abgerufen.
gute Stimmung
mycontract.call().getLength()
aber verwenden, oder?