Solidity

在 truffle 控制台會話期間,預設 testRPC 帳戶餘額未顯示在 Solidity 合約映射中

  • January 10, 2017

我注意到 testrpc 中的預設餘額,如下所示:

unix$ testrpc --account="privKey1,balance1" --account="privKey2,balance2" ...

不要傳遞給這個 Solidity 資料結構:

mapping(address => uint) public accounts

這是簡單的程式碼:

pragma solidity ^0.4.7;

contract EtherBank {

   // ---------------------------------------------------------------------------
   // Define variables used in this contract (including in constructor) here.
   // ---------------------------------------------------------------------------
   mapping(address => uint) public accounts;
   // ---------------------------------------------------------------------------

   // ---------------------------------------------------------------------------
   // Constructor (initializer). Runs once upon creation.
   // ---------------------------------------------------------------------------
   function EtherBank() {
       accounts[msg.sender] = 1000;
   }
   // ---------------------------------------------------------------------------

   // ---------------------------------------------------------------------------
   // ---------------------------------------------------------------------------
   function getBalance(address addr) constant returns (uint _balance) {
       return accounts[addr];
   }
   // ---------------------------------------------------------------------------
}

這是導致不同結果的互動式松露控制台會話:

truffle(default)> account1 = web3.eth.accounts[0]
truffle(default)> account2 = web3.eth.accounts[1]

truffle(default)> web3.eth.getBalance(account1)
{ [String: '9.99997416659e+22'] s: 1, e: 22, c: [ 999997416, 65900000000000 ] }

truffle(default)> web3.eth.getBalance(account2)
{ [String: '1e+23'] s: 1, e: 23, c: [ 1000000000 ] }

truffle(default)> c = EtherBank.deployed()

truffle(default)> c.getBalance(account1)
{ [String: '1000'] s: 1, e: 3, c: [ 1000 ] } <-- Expected above to be the same as this.

truffle(default)> c.getBalance(account2)  
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }  <-- Expected this to be same as above.

有任何想法嗎?也許我做錯了什麼。謝謝!=:)

這些結果是有道理的,因為在EtherBank部署時,只有msg.sender部署事務的 被給予平衡。

這裡有兩種完全不同的餘額類型:一種是乙太幣,即允許您支付 gas 費用並充當採礦獎勵的資金,然後是您的“銀行”餘額。當您使用

--account="privKey1,balance1" --account="privKey2,balance2" ...

選項,您將 Ether 分配給兩個帳戶,如您所見

web3.eth.getBalance(account1)

下一種餘額是“EtherBank”餘額,它只是合約儲存中的一個數字。

當建構子執行時:

function EtherBank() {
   accounts[msg.sender] = 1000;
}

你可以看到合約給創建合約的交易發送者一個餘額 1000。注意這不是1000 ETH,只是合約中的一個變數設置為 1000。

一個潛在的混淆點是:

mapping(address => uint) public accounts;

這個名字accounts完全沒有意義。我們可以命名它foo,並且合約的行為完全相同。

TestRPC 對您的合約一無所知,這是一個完全任意的構造。它在主網路上的行為與在 TestRPC 上的行為相同。

如果我理解正確,您想在合約中預設餘額(記住這些只是任意值,在合約分配給它們的範圍之外沒有任何意義)。如果是這種情況,只需將其設為建構子:

function EtherBank(address[] addrs, uint[] balances) {
   if(addrs.length != balances.length) throw;
   for(uint i; i < addrs.length; i++){
       accounts[addrs[i]] = balances[i];
   }
}

我不相信 Truffle 中的建構子可以接受參數,因此您可能必須將其設為一個只能呼叫一次的單獨函式。

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