¿Por qué funciona la activación de un método de envío en un contrato, mientras que la llamada no funciona?

Todavía soy algo nuevo en el desarrollo web y la solidez, así que corrija cualquiera de mis malentendidos. He estado trabajando con web3 en la parte delantera, pero ahora estoy tratando de configurar una integración web3 del lado del servidor usando NodeJS. Web3 parece estar correctamente conectado a mi nodo de prueba local de Ganache y, afaik, los métodos de modificación de estado funcionan correctamente, pero no se recibe ningún valor cada vez que intento obtener un valor de un método de contrato marcado como 'ver'.

Tenga en cuenta que las pruebas de mi unidad Truffle JS demuestran que el código del contrato se implementa, cambia de estado y obtiene datos con éxito. Desafortunadamente, parece que no puedo hacer que truffle-connect funcione en mi entorno NodeJS (creo que es un problema de versiones con web3), por lo que no puedo simplemente copiar y pegar el código de prueba de la unidad. Me veo obligado a renunciar a trabajar con truffle-connect y usar la guía ff: web3.eth.Contract

Código:

Los métodos de contrato de solidez se llaman:

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

Prueba unitaria de trufa exitosa:

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 configuración + llamadas de método de contrato:

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

        });

    }
});

¿Alguna idea sobre lo que puedo estar haciendo mal? He estado atascado en esto durante unos días.

Respuestas (1)

El problema está aquí:

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

El segundo parámetro debe ser la dirección del contrato implementado, pero en su lugar está pasando la dirección de su cuenta.

Gracias por el consejo y lo he cambiado, pero devuelve contractInstance.methods.getTokenUri(tokenId) .call({from:accounts[0]}) todavía no devuelve ningún valor
Oh, lo siento, parece que estás implementando una nueva instancia cada ejecución de todos modos.
Por cierto, lo siento por el error tipográfico. getEntityUri es getTokenUri