Aufruf einer zustandsändernden Funktion über web3

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 web3verwendeten 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.

Antworten (1)

moduleim 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.

Ich sollte es mycontract.call().getLength()aber verwenden, oder?