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