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

问题描述

我试图以两种不同的方式读取几个以太坊测试账户的余额,并得到了两个不同的答案,但并不是针对所有账户。更具体地说,我正在与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库进行了相同的观察。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...