Solidity
在 truffle 控制台會話期間,預設 testRPC 帳戶餘額未顯示在 Solidity 合約映射中
我注意到 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 中的建構子可以接受參數,因此您可能必須將其設為一個只能呼叫一次的單獨函式。