Llamar a una función de cambio de estado a través de web3

Estoy tratando de llamar a una función que cambia la longitud de una matriz de almacenamiento global.

Al principio pensé que el problema estaba relacionado con el intento de cambiar la longitud de la matriz.

Pero finalmente me di cuenta de que está relacionado con la forma en que lo llamo a través de web3.

Aquí se da una pregunta similar , pero no proporciona el web3código que se ha utilizado, por lo que no puedo hacer una correlación adecuada entre la respuesta y el problema en mi código.

Aquí está mi código Python:

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

Y aquí está mi código Solidity:

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;
    }
}

Gracias.

Respuestas (1)

moduleen el código de la pregunta siempre solo hará "llamadas". Si desea cambiar de estado, debe realizar una transacción . En web3.py, se ve así:

mycontract = contract(address)
mycontract.transact({... your transaction parameters ...}).setLength(1)

Luego, después de esperar a que se extraiga la transacción, getLength()recuperará el nuevo valor.

Sin embargo, debería usar mycontract.call().getLength(), ¿verdad?