Web3.py-Transaktionen funktionieren, Anrufe jedoch nicht

Ich versuche, einen ziemlich einfachen Vertrag auf einer privaten Blockchain aufzurufen:

function getOwner() public returns (address) {
    return owner;
}

Und hier ist mein Ausführen von einer interaktiven Python-Shell:

>>> e.unlock_account()

>>> instance.functions.getOwner().transact()
HexBytes('0x4f366ba7bb7ae0ef70e48c3ce7eb4f920d7079e90a10bfea36fc9fbbb48d52fe')

Das funktioniert gut, aber ich brauche den Rückgabewert der Funktion, nicht den Transaktionshash. Ich glaube also, ich muss es dann richtig nennen?

>>> e.unlock_account()

>>> instance.functions.getOwner().call({'from': e.account})

... error trace ...
eth_abi.exceptions.InsufficientDataBytes: Tried to read 32 bytes.  Only got 0 bytes
... more error traces ...
raise BadFunctionCallOutput(msg) from e
web3.exceptions.BadFunctionCallOutput: Could not transact with/call contract function, is contract deployed correctly and chain synced?

Hat jemand eine Ahnung, was ich falsch mache?


Bearbeiten: Ich habe es mit einem anderen, noch grundlegenderen Vertrag getestet, und es scheint gut zu funktionieren. Die Verträge unterscheiden sich nur darin, dass derjenige, der funktioniert, einen int zurückgibt.

function reveal() public view returns (int) {
    return number;
}

Wenn ich die obige Funktion aufrufe, gibt sie die richtige Zahl zurück.


Edit 2: Ich habe alle Funktionen zum Festlegen einer Eigentümeradresse aus dem Vertrag entfernt, und jetzt funktioniert alles. Ich habe die Vorher- und Nachher-Versionen des Vertrags bereitgestellt, falls jemand anderes auf das gleiche Problem stößt. Ich habe immer noch keine Ahnung, was dazu führt, dass der Vertrag nicht mit Adressen funktioniert. Hat es etwas mit dem Konstruktor zu tun? Alle Erklärungen sind willkommen!

BEFORE EDIT (NOT WORKING)    

pragma solidity ^0.4.0;

contract CryptoCert {

struct Award {
    bool isValid;
    string hash;
}

struct Authority {
    bool isValid;
    string hash;
    address[] representatives;
    Award[] awards;
}

address private owner;

mapping(address => Authority) authorities;

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

modifier onlyBy(address _address) {
    require(msg.sender == _address);
    _;
}

function CryptoCert() public {
    owner = msg.sender;
}

function kill() external {
    if (msg.sender == owner) {
        selfdestruct(owner);
    }
}

function createAuthority(address _address, string _hash) public onlyOwner {
    authorities[_address].hash = _hash;
    authorities[_address].isValid = true;
}

function addAuthorizedAddress(address _authAddress, address _repAddress) public onlyBy(_authAddress) {
    authorities[_authAddress].representatives.push(_repAddress);
}

function getAuthorityHash(address _address) public view returns (uint) {
    if (authorities[_address].isValid) {
        return 1;
    } else {
        return 0;
    }
}

function getOwner() public view returns (address) {
    return owner;
}

function test() public pure returns (string) {
    return "nigchicken69";
}

}

Und danach...

AFTER EDIT (WORKING)

pragma solidity ^0.4.0;

contract CryptoCert2 {

    struct Award {
        bool isValid;
        string hash;
    }

    struct Authority {
        bool isValid;
        string hash;
        address[] representatives;
        Award[] awards;
    }

    mapping(address => Authority) authorities;

    function createAuthority(address _address, string _hash) public {
        authorities[_address].hash = _hash;
        authorities[_address].isValid = true;
    }

    function addAuthorizedAddress(address _authAddress, address _repAddress) public {
        authorities[_authAddress].representatives.push(_repAddress);
    }

    function getAuthorityHash(address _address) public view returns (uint) {
        if (authorities[_address].isValid) {
            return 1;
        } else {
            return 0;
        }
    }

}
Der Fehler deutet darauf hin, dass der Vertrag nicht an dieser Adresse in der Kette bereitgestellt wird, mit der web3 verbunden ist. Vielleicht falsche Verbindungsparameter, vielleicht wird der Vertrag nicht bereitgestellt, vielleicht ist die Adresse für den Vertrag falsch.
Ich dachte das gleiche, aber ich habe alle Parameter doppelt und dreifach überprüft. Der Vertrag ist definitiv da und live. Ich habe den Beitrag mit einem anderen sehr einfachen Vertrag aktualisiert, der gut zu funktionieren scheint.
Solidity 0.4.0 ist 1,5 Jahre alt. Können Sie es mit 0.4.19 oder .20 versuchen?

Antworten (1)

Der Aufruf von Lesefunktionen ist einfach:

print('zurückgegebener Wert: {}'.format(contractInstance.functions.getXyz().call()))

Stellen Sie sicher, dass Sie die neueste Python- und web3.py-Version 4 installieren