Warum funktioniert das Auslösen eines Sendens bei einer Vertragsmethode, während ein Anruf nicht funktioniert?

Ich bin noch etwas neu in der Webentwicklung und Solidität, also korrigieren Sie alle meine Missverständnisse. Ich habe mit web3 am Frontend gearbeitet, aber jetzt versuche ich, eine serverseitige web3-Integration mit NodeJS einzurichten. Web3 scheint ordnungsgemäß mit meinem lokalen Ganache-Testknoten verbunden zu sein, und afaik funktionieren die Zustandsänderungsmethoden ordnungsgemäß, aber es wird kein Wert empfangen, wenn ich versuche, einen Wert aus einer mit „Ansicht“ gekennzeichneten Vertragsmethode abzurufen.

Denken Sie daran, dass meine Truffle JS-Einheitentests beweisen, dass der Vertragscode erfolgreich bereitgestellt wird, den Status ändert und Daten abruft. Leider kann ich Truffle-Connect in meiner NodeJS-Umgebung nicht zum Laufen bringen (ein Versionsproblem mit web3, denke ich), daher kann ich den Komponententestcode nicht einfach kopieren und einfügen. Ich bin gezwungen, auf die Arbeit mit truffle-connect zu verzichten und den ff-Leitfaden zu verwenden: web3.eth.Contract

Code:

Solidity Contract-Methoden, die aufgerufen werden:

contract NFT is ERC721 {
    ...
    function createEntity(address _providerOwner, address _recipient, 
        uint256 _tokenId, string proof, uint64 tokenPoints, uint64 
        soldFor, uint64 soldAt) public {
        require(!exists(_tokenId));

        _mint(_providerOwner, _tokenId);

        ownerProviders[_tokenId] = _providerOwner;
        recipients[_tokenId] = _recipient;

        _setTokenURI(_tokenId, proof);
        setTokenPoints(_tokenId, tokenPoints);
        setSellPrice(_tokenId, soldFor);
        setSellDate(_tokenId, soldAt);
    }

    function getEntityUri(uint256 _tokenId) external view returns 
      (string) {
        require(exists(_tokenId));
        return tokenURIs[_tokenId];
    }
    ...
}

Erfolgreicher Truffle Unit Test:

it("createEntity method test", function () {
    return entityContract.deployed().then(function(instance) {
        instance.createEntity(providerOwnerAddress, recipientAddress, tokenId, tokenUri, tokenPoints, soldFor, soldAt);
        return instance;
    }).then(function(instanceRes) {
        console.log("   createEntity called");
        return instanceRes.getTokenUri(tokenUri);
    }).then(function(uri) {
        //uri == tokenUri == "proof" (always successful)
        assert.equal(uri, tokenUri, "tokenUri result was not the same: " + uri);
    });
})

NodeJS-Backend-Web3-Setup + Vertragsmethodenaufrufe:

var Web3 = require('web3');
var web3 = new Web3('http://localhost:7545’);

var abi = [{…}]

web3.eth.getAccounts((error, accounts) => {
    if(error){
        // no errors here
        console.log("getAccounts error: ", error);
    } else {
        var entityContract = new web3.eth.Contract(abi, accounts[0], {
            from: accounts[0],
            gasPrice: '20000000000', 
        });

        var contractInstance;
        var contractAddress;

        entityContract.deploy({
            data: '0x12345',
            arguments: [“SomeObject”, “OBJ”]
        })
        .send({
            from: accounts[0],
            gas: 1500000,
            gasPrice: '30000000000000'
        }, function(error, transactionHash){

            // everything seems fine so far
            console.log("deploy: txHash: ", transactionHash)
            console.log("deploy: error: ", error)

        })
        .then(function(newContractInstance){

            contractInstance = newContractInstance;
            contractAddress = newContractInstance.options.address

            //always generates a new contract creation transaction on ganache - works afaik
            return contractInstance.methods.createEntity(providerOwnerAddress, recipientAddress, tokenId, tokenUri, tokenPoints, soldFor, soldAt)
            .send({from: accounts[0]})

        }).then(function(result){

            return contractInstance.methods.getTokenUri(tokenId)
                .call({from:accounts[0]})

        }).then(function(uri){

            //prints as "getTokenUri uri:" and no uri value returned
            console.log("getTokenUri uri: ", uri);

        }).catch(function(e) {

            //no error
            console.log("deploy err: ", e);

        });

    }
});

Irgendwelche Ideen, was ich falsch machen könnte? Daran hänge ich seit ein paar Tagen.

Antworten (1)

Das Problem ist hier:

new web3.eth.Contract(abi, accounts[0], ...

Der zweite Parameter muss die Adresse des bereitgestellten Vertrags sein, aber Sie übergeben stattdessen die Adresse Ihres Kontos.

Danke für den Tipp und ich habe ihn geändert, aber return contractInstance.methods.getTokenUri(tokenId) .call({from:accounts[0]}) gibt immer noch keinen Wert zurück
Oh, Entschuldigung, es sieht so aus, als würden Sie sowieso bei jedem Lauf eine neue Instanz bereitstellen.
Übrigens, sorry für den Tippfehler. getEntityUri ist getTokenUri