Wie finde ich den Wert mit der Methode call() in truffle und testrpc heraus?

       pragma solidity ^0.4.2;

       contract Transfer {

                address public owner;  
                mapping (address => uint) balances;

               // constructor
               function Transfer() {
                             owner=msg.sender;
                             balances[owner]=1000;
               }

               function transferToUser(address _to, uint _value) returns (bool success)  {

                 if(balances[msg.sender]< _value){
                     return false;
                  }

                  balances[msg.sender] -= _value;
                  balances[_to] += _value;
                  return true;
           }
          function getBalance(address _user) returns (uint _balance){
                  return balances[_user];
          }

     }

Dies ist der Code für den Vertrag, den ich mit testrpc und truffle bereitgestellt habe.

Ich habe die folgenden Befehle in Trüffel verwendet.

      var contract=Transfer.deployed();
      contract.owner.call().then(console.log);

Der Eigentümer wird korrekt gedruckt. Dann wird die Methode call () verwendet, um den Kontostand zu drucken.

      contract.balances[owner].then(console.log);

Diese Aufrufmethode hat einen Fehler zurückgegeben. Wie können wir den Wert in balances[owner] drucken?

Die im Vertrag definierten Funktionen werden wie folgt aufgerufen.

          contract.transferToUser("0x4f91a3661a18328bc5d995a1f8b63cc69778a529",300).then(console.log)


         contract.getBalance("0x4f91a3661a18328bc5d995a1f8b63cc69778a529").then(console.log)

Beide Funktionen haben den Hash-Wert der Transaktion zurückgegeben. Wie können wir die von der Funktion getBalance() zurückgegebenen Salden überprüfen, z. B. balances[msg.sender],balances[_to],balances[_user]?

@Rob Hitchens Wie können wir die im Array gespeicherten Werte erhalten?

Antworten (1)

Sie haben die richtige Idee, wenn Sie die Salden für jeweils eine Adresse überprüfen und Versprechungen verwenden.

Die eckigen Klammern sind hier komisch. Sieht so aus, als würden Sie den Array-Stil anpassen, aber dies ist ein Funktionsaufruf, der eine Zahl zurückgibt. Sie haben einen txhash erhalten, weil Sie eine Transaktion zum Schürfen gesendet haben ... anders als call (), die lokal, schreibgeschützt, schneller, kostenlos (kein Gas) ist und die zurückgegebenen Werte angibt.

contract.balances[owner].then(console.log);

Versuchen

contract.balances.call(owner).then(console.log);

Du bist hier ganz in der Nähe. Ich habe es nur etwas ausgebaut.

contract.owner.call()
.(then(function(ownerReturned) {
  console.log("got owner", ownerReturned);
})
.catch(function(err) {
 console.error("problem getting owner", err;
});

und mit runden Klammern ...

contract.balance.call(owner)
.then(function(balanceReturned) {
  // balanceReturned will be in bigNumber format
  // try ...
  var bal = balanceReturned.toString(10);
  console.log("Balance returned", bal);   
})
.catch(function(error) {
  console.error("Error getting balance", error):
})

Zum Glück habe ich dir nichts mit Fehlern gegeben. Es ist ein bisschen Gekritzel meinerseits.

Für die Übertragungsfunktion muss der Status aktualisiert werden, also lassen Sie call() wie folgt fallen, erhalten Sie eine Quittung und warten Sie, bis sie abgebaut wird (nicht gezeigt):

transferToUser(args, args).
.then(function(txn) {
  // Add something to wait for it to be mined.
  // after it's mined, this should work
  return contract.balance.call(args);
})
  .then(function(returnedBalance) {
  // carry on with the updated balance in hand
});

Ich hoffe es hilft.