Wie kommt web3.py mit konstanten Getter-Funktionen zurecht?

Ich habe einen Smart Contract erstellt und teste ihn jetzt mit der Python-Schnittstelle von web3.py. In meinem Vertrag habe ich einige private Variablen deklariert und Getter-Funktionen mit Modifikatoren erstellt, um diese privaten Variablen zurückzugeben. Wenn ich jedoch die Getter-Funktion aufrufe, wird die private Variable zurückgegeben, egal welches Konto gerade entsperrt ist. Beim Testen in Remixwird der Wert nicht zurückgegeben, wenn von demselben Konto darauf zugegriffen wird. Weiß jemand, ob das ein web3.pyBug ist oder hat es etwas mit der Vertragslogik zu tun?

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

Bearbeiten:

Ich denke, es hat etwas mit der Concise Contract-Klasse von zu tun web3.py. Was ist die Standard-Sendeadresse bei Verwendung der web3.pyFunktion , wenn keine über ein Wörterbuch bereitgestellt wird?call()transact

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?

Antworten (2)

In meinem Vertrag habe ich einige private Variablen deklariert und Getter-Funktionen mit Modifikatoren erstellt, um diese privaten Variablen zurückzugeben

Es ist wichtig zu verstehen, dass diese Werte nicht wirklich „privat“ sind. Jeder könnte die Blockchain untersuchen, um diese Werte aufzudecken. Das privateSchlüsselwort macht es nur weniger bequem.

Wenn es eine schlechte Sache ist, dass jeder Ihren privaten Wert lesen kann, müssen Sie einen anderen Weg finden, um Ihr Ziel zu erreichen.

Was ist die Standard-Sendeadresse, wenn keine über ein transactWörterbuch bereitgestellt wird?

Es ist dasselbe wie der Standard-Absender in einer Transaktion: Es ist standardmäßig web3.eth.defaultAccountoder was auch immer Ihr Client-Standard-Absender ist.

Da Sie telefonieren möchten, sollten Sie ein callWörterbuch bereitstellen. Das würde so aussehen:

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

Es lohnt sich zu wiederholen: Dies ist kein effektiver Mechanismus, um den Wert vor der Welt zu verbergen.

Es hängt höchstwahrscheinlich mit der Logik zusammen, wie Sie den Wert festlegen.

Der Ethereum-Knoten gibt den alten Wert zurück, bis die von Ihnen aufgerufene Transaktion exampleContract(uint256 _value)abgebaut ist.

Abhängig von Ihrem Ethereum-Knoten-Setup, das nicht in Frage gestellt wurde, kann dies sofort, einige Sekunden oder einige Minuten dauern.