Solidity
如何在松露和 testrpc 中使用 call() 方法找出值?
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 });
希望能幫助到你。