Solidity

如何在松露和 testrpc 中使用 call() 方法找出值?

  • January 5, 2017
      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];
         }

    }

這是我使用 testrpc 和 truffle 部署的合約程式碼。

我在松露中使用了以下命令。

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

所有者列印正確。然後使用 call() 方法列印餘額。

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

此呼叫方法返回錯誤。我們如何列印餘額中的值

$$ owner $$? 合約中定義的函式呼叫如下。

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


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

兩個函式都返回了交易的雜湊值。我們如何查看函式getBalance()返回的餘額,例如餘額

$$ msg.sender $$, 餘額$$ _to $$, 餘額$$ _user $$?

一次檢查一個地址的餘額並使用 Promise,您的想法是正確的。

方括號在這裡很奇怪。看起來您正在調整數組樣式,但這是一個返回一個數字的函式呼叫。你得到了一個 txhash,因為你發送了一個要開采的交易……不同於 call() 是本地的、只讀的、更快的、免費的(無氣體)並給出返回值。

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

嘗試

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

你離這裡很近。我只是做了一點。

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

並且,帶圓括號…

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

幸運的是,我沒有給你一些有錯誤的東西。這對我來說有點亂七八糟。

對於 transfer 函式,它需要更新狀態,所以像這樣丟棄 call() ,獲取收據並等待它被探勘(未顯示):

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

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/11136