¿Cómo se las arregla web3.py con las funciones captadoras constantes?

Creé un contrato inteligente y ahora lo estoy probando usando la interfaz de python de web3.py. En mi contrato, declaré algunas variables privadas y creé funciones getter con modificadores para devolver estas variables privadas. Sin embargo, si estoy llamando a la función getter, se devuelve la variable privada, sin importar qué cuenta esté desbloqueada en ese momento. Al probar en Remix, el valor no se devuelve si se accede desde la misma cuenta. ¿Alguien sabe si esto es un web3.pyerror o tiene algo que ver con la lógica del contrato?

pragma solidity ^0.4.16;

contract exampleContract {
    uint256 private value;
    address public owner;

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function exampleContract(uint256 _value) public {
        owner = msg.sender;
        value = _value;
    }

    function viewValue() onlyOwner public returns(uint256) {
        return(value);
    }
}

Editar:

Creo que tiene algo que ver con la clase Concise Contract de web3.py. Usando la web3.pyfunción call(), ¿cuál es la dirección de envío predeterminada si no se proporciona ninguna a través de un transactdiccionario?

from web3 import Web3, IPCProvider
from web3.contract import ConciseContract

ipc_path = '/path/to/geth.ipc'
web3 = Web3(IPCProvider(ipc_path)
contract = web3.eth.contract(abi = abi, address = address, ContractFactoryClass = ConciseContract)
contract.viewValue() #Who is the sender when unlocking of an account is not required?

Respuestas (2)

En mi contrato, declaré algunas variables privadas y creé funciones getter con modificadores para devolver estas variables privadas.

Es importante comprender que estos valores no son realmente "privados". Cualquiera podría inspeccionar la cadena de bloques para descubrir estos valores. La privatepalabra clave solo lo hace menos conveniente.

Si es malo que cualquiera pueda leer su valor privado, entonces deberá encontrar otra forma de lograr su objetivo.

¿Cuál es la dirección de envío predeterminada si no se proporciona ninguna a través de un transactdiccionario?

Es lo mismo que el remitente predeterminado en una transacción: por defecto es web3.eth.defaultAccounto cualquiera que sea el remitente predeterminado de su cliente.

Dado que desea realizar una llamada, debe proporcionar un calldiccionario. Eso se vería como:

contract.viewValue(call={'from': SENDING_ACCOUNT})

Vale la pena repetirlo: este no es un mecanismo efectivo para ocultar el valor del mundo.

Lo más probable es que esté relacionado con la lógica de cómo establece el valor.

El nodo Ethereum devolverá el valor anterior hasta que se extraiga la transacción a la que llama exampleContract(uint256 _value).

Dependiendo de la configuración de su nodo Ethereum, que no se describió en la pregunta, esto podría ser instantáneo, unos segundos o unos minutos.