为什么在读取以太坊账户余额时会得到两个不同的答案?

时间:2020-11-05 16:07:23

标签: blockchain ethereum smartcontracts web3 ganache

我试图以两种不同的方式读取几个以太坊测试账户的余额,并得到了两个不同的答案,但并不是针对所有账户。更具体地说,我正在与Ganache建立一个测试以太坊网络,并使用连接到测试网络的Remix部署了以下智能合约。默认情况下,第一个帐户用于部署事务。

pragma solidity ^0.6.0;

contract Test {
    
    function balanceOf(address addr) external view returns (uint) {
        return addr.balance;
    }
    
}

在Ganache提供的帐户上的Remix中调用balanceOf函数的工作原理很吸引人。然后,我使用最新的Web3.py库运行以下Python代码,以在所有帐户上调用balanceOf函数。

from web3 import Web3
import json

web3 = Web3(Web3.HTTPProvider('http://127.0.0.1:7545'))   # connecting to the Ganache Ethereum network

def toEther(balance):
    return web3.fromWei(balance, 'ether')

# connecting to the 'Test' contract
abi = json.loads('[ { "inputs": [ { "internalType": "address", "name": "addr", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]')
contract_address = '0x3038871e10654B87858Be4952B26bd7607Cb0c8b'   # this will be different for you
contract = web3.eth.contract(abi=abi, address=contract_address)

# printing balances
for account in web3.eth.accounts: 
    print(f'balance of {account}:  {toEther(contract.functions.balanceOf(account).call())}  versus {toEther(web3.eth.getBalance(account))}')

如您所见,余额的计算方式有两种:

  1. 通过调用产生第一个数字的合同的balanceOf函数,
  2. 通过调用Web3的web3.eth.getBalance方法产生第二个数字。 结果就是这样
balance of 0x76290BDDea6C156A7F364aBB952aE29D49C593bE:  180143885.09682616  versus 99.99799366
balance of 0x3BFCAC461d922e3b4504BB5fc59dA5546a767617:  100  versus 100
balance of 0xD2AA30E855eb3F9B64A14Bb1a4EE4C4Ad645dA58:  100  versus 100
...

如您所见,合同的balanceOf函数对于第一个地址产生了错误的结果。 web3.eth.getBalance方法显示正确的结果(100-用于部署的气体)。我在不重新启动Ganache网络的情况下再次部署了合约,但得到了以下结果(仍然调用第一个部署,但这没关系):

balance of 0x76290BDDea6C156A7F364aBB952aE29D49C593bE:  180143885.0988325  versus 99.99598732
balance of 0x3BFCAC461d922e3b4504BB5fc59dA5546a767617:  100  versus 100
balance of 0xD2AA30E855eb3F9B64A14Bb1a4EE4C4Ad645dA58:  100  versus 100
...

如您所见,由于第二次部署交易,第一个值出乎意料地增加了汽油费(约0.002),而第二个值却下降了预期的相同数量。最后,我再次使用第二个帐户而不是第一个帐户部署了合同。同样,除了第一个帐户之外,两种余额计算都得出正确的结果:

balance of 0x76290BDDea6C156A7F364aBB952aE29D49C593bE:  180143885.0988325  versus 99.99598732
balance of 0x3BFCAC461d922e3b4504BB5fc59dA5546a767617:  99.99799366  versus 99.99799366
balance of 0xD2AA30E855eb3F9B64A14Bb1a4EE4C4Ad645dA58:  100  versus 100

我是区块链技术的新手,我想知道是否有人可以使用Web3向我解释第一个帐户(仅!!!)的balanceOf函数的奇怪行为。如我所说,在Remix中调用该函数总是可以得到正确的结果。

PS:这不是Python问题。我使用Web3.js库进行了相同的观察。

0 个答案:

没有答案