本文环境:
区块链:以太坊POA联盟链;
出块节点数:3;
操作系统:windows 64;
节点版本:Geth1.9.14;
node版本:v10.14.0
参考文档:https://web3js.readthedocs.io/en/v1.2.8/
目录
2.6 transactionConfirmationBlocks
为了让DAPP在区块链网络上运行起来,用户需要使用web3.js库提供的web3对象。它通过rpc调用与一个本地节点进行通讯。也就是说,web3.js作为开放的rpc层,是与以太坊节点协同工作的。
0.1 使用回调
web3 JavaScript API设计为跟一个本地rpc节点协同工作,默认使用同步HTTP请求。
如果想发出异步HTTP请求,可以采用错误优先(error first)回调方式,把一个可选回调函数作为最后一个参数传进去:
web3.eth.getBlock(48, function(error, result){
if(!error)
//If no error occurred, return result
console.log(result)
else
//If an error occurred, handle it (throw, etc)
console.error(error);
})
0.2 批量请求
批量请求的处理:
var batch = web3.createBatch();
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
batch.execute();
0.3 大数(Big Number)的处理
javaScript本质上对大数对象的处理不在行,比如下面的例子:
"101010100324325345346456456456456456456"
// "101010100324325345346456456456456456456"
101010100324325345346456456456456456456
// 1.0101010032432535e+38
因此,web3.js会自动加载BigNumber.js库来处理大数和进行完美计算。
下面的例子中,web3.eth.getBalance()方法获取地址余额,该方法返回一个Big Number对象;此时,需要调用toString(),把它转换成数字字符串。
var balance = new BigNumber('123456786979284780000000000');
// or var balance = web3.eth.getBalance(someAddress);
balance.plus(21).toString(10); // toString(10) converts it to a number string
// "123456786979284780000000021"
下面的例子中,因为是超过20个浮点数位的大数,BigNumber.js仍然无法正确处理;因此推荐以sha为单位存储余额,仅在向用户呈现时再转换成其他单位。web3.js自身总是以sha为单位返回和调取余额。
var balance = new BigNumber('13124.234435346456466666457455567456');
balance.plus(21).toString(10); // toString(10) converts it to a number string, but can only show max 20 floating points
// "13124.23443534645646666646" // you number would be cut after the 20 floating point
一、web3
为了在node.js中使用web3.js,可以在项目目录中运行:
d:\myProject>npm install web3
本文一直没有安装成功,因此尝试使用以下方式安装:
//安装cnpm
C:\WINDOWS\system32>npm install -g cnpm --registry=https://registry.npm.taobao.org
//安装工具环境windows-build-tools,该步骤包括安装python2.7
C:\WINDOWS\system32>npm install -g --production windows-build-tools
//安装web3
C:\WINDOWS\system32>cnpm install -g web3
Downloading web3 to C:\Program Files\nodejs\node_global\node_modules\web3_tmp
[1/7] web3-net@1.2.8 installed at node_modules\_web3-net@1.2.8@web3-net
[2/7] web3-eth-personal@1.2.8 installed at node_modules\_web3-eth-personal@1.2.8@web3-eth-personal
[3/7] web3-shh@1.2.8 installed at node_modules\_web3-shh@1.2.8@web3-shh
[4/7] web3-utils@1.2.8 installed at node_modules\_web3-utils@1.2.8@web3-utils
[5/7] web3-eth@1.2.8 installed at node_modules\_web3-eth@1.2.8@web3-eth
[6/7] web3-core@1.2.8 installed at node_modules\_web3-core@1.2.8@web3-core
[7/7] web3-bzz@1.2.8 installed at node_modules\_web3-bzz@1.2.8@web3-bzz
execute post install 5 scripts...
.........................................................................................................................................
All packages installed (315 packages installed from npm registry, used 28s(network 6s), speed 1.31MB/s, json 288(688.25kB), tarball 7.52MB)
C:\WINDOWS\system32>
然后在源代码中使用require导入它;一个web3实例代表与节点的一个连接。
Example
var Web3= require('web3');
// create an instance of web3 using the HTTP provider.
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
或者,通过检查web3是否是undefined,来确保代码的可靠运行。
如果web3被定义了,则使用已经可用的实例;否则,通过连接至自定义节点创建一个实例。
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
直接查看web3对象:
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3);
1.1 web3.version
web3.version
查询当前web3.js库版本。
Returns
- string:版本号。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.version); //1.2.8
1.2 web3.setProvider
web3.setProvider(provider)
在创建web3实例之后,可以使用setProvider方法改变provider,它有一个实参,即新provider实例。
Example
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
// or
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
// change provider
web3.setProvider('ws://localhost:8546');
// or
web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
// Using the IPC provider in node.js
var net = require('net');
var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path
// or
var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os path
// on windows the path is: "\\\\.\\pipe\\geth.ipc"
// on linux the path is: "/users/myuser/.ethereum/geth.ipc"
1.3 web3.providers
web3.providers
Returns
- object:The HTTP provider 对象;
- object:The Websocket provider 对象;
- object:The IPC provider 对象,本地节点;安全连接模式。
Example
var Web3 = require('web3');
// use the given Provider, e.g in Mist, or instantiate a new websocket provider
var web3 = new Web3(Web3.givenProvider || 'ws://remotenode.com:8546');
// or
var web3 = new Web3(Web3.givenProvider || new Web3.providers.WebsocketProvider('ws://remotenode.com:8546'));
// Using the IPC provider in node.js
var net = require('net');
var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path
// or
var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os path
// on windows the path is: "\\\\.\\pipe\\geth.ipc"
// on linux the path is: "/users/myuser/.ethereum/geth.ipc"
Configuration
// ====
// Http
// ====
var Web3HttpProvider = require('web3-providers-http');
var options = {
keepAlive: true,
withCredentials: false,
timeout: 20000, // ms
headers: [
{
name: 'Access-Control-Allow-Origin',
value: '*'
},
{
...
}
],
agent: {
http: http.Agent(...),
baseUrl: ''
}
};
var provider = new Web3HttpProvider('http://localhost:8545', options);
// ==========
// Websockets
// ==========
var Web3WsProvider = require('web3-providers-ws');
var options = {
timeout: 30000, // ms
// Useful for credentialed urls, e.g: ws://username:password@localhost:8546
headers: {
authorization: 'Basic username:password'
},
// Useful if requests result are large
clientConfig: {
maxReceivedFrameSize: 100000000, // bytes - default: 1MiB
maxReceivedMessageSize: 100000000, // bytes - default: 8MiB
},
// Enable auto reconnection
reconnect: {
auto: true,
delay: 5000, // ms
maxAttempts: 5,
onTimeout: false
}
};
var ws = new Web3WsProvider('ws://localhost:8546', options);
1.4 web3.currentProvider
web3.currentProvider
web3.currentProvider属性被自动分配给当前的provider实例。
Returns
- object:当前provider实例或者空(null)。
Example
// Check if eth already set a provider
if(!web3.currentProvider)
web3.setProvider(new Web3.providers.HttpProvider("http://localhost:8545"));
二、web3.eth
2.1 defaultAccount
web3.eth.defaultAccount
默认地址用于"from"属性,如果没有"from"属性则用于以下方法:
- web3.eth.sendTransaction()
- web3.eth.call()
- new web3.eth.Contract() -> myContract.methods.myMethod().call()
- new web3.eth.Contract() -> myContract.methods.myMethod().send()
returns
- String:20 Bytes: 一个以太坊地址。 (Default is
undefined
)
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.defaultAccount); //undefined
web3.eth.defaultAccount = "0x0297a8913cc187d60712f095a7e1bf2421bfcd40";
console.log(web3.eth.defaultAccount); //0x0297a8913cc187d60712f095a7e1bf2421bfcd40
2.2 defaultBlock
web3.eth.defaultBlock
默认区块,默认值 ="latest"。用于以下方法:
- web3.eth.getBalance()
- web3.eth.getCode()
- web3.eth.getTransactionCount()
- web3.eth.getStorageAt()
- web3.eth.call()
- new web3.eth.Contract() -> myContract.methods.myMethod().call()
returns
默认区块可以是下面的类型值:
-
Number:区块号;
-
String:“genesis”,创世区块;
-
String:“earliest”,创世区块;
-
String:“latest”,默认值,区块链中最新的区块;
-
String:“pending”,当前挖矿区块(包含了pending的交易);
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.defaultBlock); //latest,默认值
web3.eth.defaultBlock = 12345;
console.log(web3.eth.defaultBlock); //12345
web3.eth.defaultBlock = "genesis";
console.log(web3.eth.defaultBlock); //genesis
2.3 defaultHardfork
web3.eth.defaultHardfork
默认分叉属性,用于本地签名交易;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.defaultHardfork); //undefined,本文poa私链
web3.eth.defaultHardfork = "istanbul";
console.log(web3.eth.defaultHardfork); //istanbul
2.4 defaultChain
web3.eth.defaultChain
默认链属性,用于本地签名交易;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.defaultChain); //undefined,本文poa私链
web3.eth.defaultChain = "mainnet";
console.log(web3.eth.defaultChain); //mainnet
2.5 transactionBlockTimeout
web3.eth.transactionBlockTimeout
交易区块超时;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.transactionBlockTimeout); //50,默认值
web3.eth.transactionBlockTimeout = 60 ;
console.log(web3.eth.transactionBlockTimeout); //60
2.6 transactionConfirmationBlocks
web3.eth.transactionConfirmationBlocks
交易确认区块数;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.transactionConfirmationBlocks); //24,默认值
web3.eth.transactionConfirmationBlocks = 12 ;
console.log(web3.eth.transactionConfirmationBlocks); //12
2.7 transactionPollingTimeout
web3.eth.transactionPollingTimeout
交易轮询超时,改属性通过HTTP连接使用。此选项定义Web3等待确认交易已被网络挖掘的收据的秒数。
注意:如果此方法超时,则交易可能仍处于pending状态。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log(web3.eth.transactionPollingTimeout); //750,默认值
web3.eth.transactionPollingTimeout = 600 ;
console.log(web3.eth.transactionPollingTimeout); //600
2.8 getProtocolVersion
web3.eth.getProtocolVersion([callback])
节点的以太坊协议版本;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getProtocolVersion().then(console.log); //'0x41'
2.9 isSyncing
web3.eth.isSyncing([callback])
检查节点当前是否已经与网络同步;
Returns
一个Promise对象,其解析值为Object
或Boolean
。如果节点尚未与网络同步, 则返回false,否则返回一个同步对象,具有以下属性:
-
startingBlock - Number: 同步起始块编号
-
currentBlock - Number: 当前已同步块编号
-
highestBlock - Number: 预估的目标同步块编号
-
knownStates - Number: 预估的要下载的状态
-
pulledStates - Number: 已经下载的状态
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.isSyncing().then(console.log);//本文为poa私链节点,仅同步不出块,已经同步到最新区块,结果返回:false
//预期结果:
{
startingBlock: 100,
currentBlock: 312,
highestBlock: 512,
knownStates: 234566,
pulledStates: 123455
}
2.10 getCoinbase
web3.eth.getCoinbase([callback])
当前接收挖矿奖励的账户地址;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getCoinbase().then(console.log); //0x0297a8913cc187d60712f095a7e1bf2421bfcd40
2.11 isMining
web3.eth.isMining([callback])
检查节点的挖矿状态;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.isMining().then(console.log); //false or true
2.12 getHashrate
web3.eth.getHashrate([callback])
当前挖矿节点的每秒钟哈希值算出数量;
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getHashrate().then(console.log); //493736;如果返回0,表示本节点没有挖矿
2.13 getGasPrice
web3.eth.getGasPrice([callback])
获取当前gas价格,该价格由最近的若干区块的gas价格中值决定。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getGasPrice().then(console.log); //1000000000
2.14 getAccounts
web3.eth.getAccounts([callback])
当前节点控制的账户列表。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getAccounts().then(console.log);
[ '0x0297a8913cc187D60712F095a7E1BF2421bFCD40',
'0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568',
'0xDa25997b15a6BeA86116942B8Ab69a5620D82284' ]
2.15 getBlockNumber
web3.eth.getBlockNumber([callback])
当前区块号。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getBlockNumber().then(console.log); //206136
2.16 getBalance
web3.eth.getBalance(address [, defaultBlock] [, callback])
获取指定块中特定账户地址的余额。
Parameters
-
String :address- 要检查余额的账户地址;
-
Number|String :defaultBlock- 可选,使用该参数覆盖web3.eth.defaultBlock属性值;
Returns
- 一个Promise对象,其解析值为指定账户地址的余额字符串,以wei为单位。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getBalance("0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568").then(console.log); //1539182000000000000
eth的单位说明:
{ noether: '0',
wei: '1',
kwei: '1000',
Kwei: '1000',
babbage: '1000',
femtoether: '1000',
mwei: '1000000',
Mwei: '1000000',
lovelace: '1000000',
picoether: '1000000',
gwei: '1000000000',
Gwei: '1000000000',
shannon: '1000000000',
nanoether: '1000000000',
nano: '1000000000',
szabo: '1000000000000',
microether: '1000000000000',
micro: '1000000000000',
finney: '1000000000000000',
milliether: '1000000000000000',
milli: '1000000000000000',
ether: '1000000000000000000',
kether: '1000000000000000000000',
grand: '1000000000000000000000',
mether: '1000000000000000000000000',
gether: '1000000000000000000000000000',
tether: '1000000000000000000000000000000' },
2.17 getStorageAt
web3.eth.getStorageAt(address, position [, defaultBlock] [, callback])
返回一个以太坊地址的指定位置存储内容。
Parameters
-
String :address- 要读取的地址
-
Number :position- 存储中的索引编号
-
Number|String :defaultBlock- 可选,使用该参数覆盖web3.eth.defaultBlock属性值
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getStorageAt("0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602",0).then(console.log); //账号地址,返回0x0000000000000000000000000000000000000000000000000000000000000000
web3.eth.getStorageAt("0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602",0).then(console.log); //合约地址,返回0x00000000000000000000000000000000000000000000d3c21bcecceda1000000
web3.eth.getStorageAt("0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602",1).then(console.log); //合约地址,返回0x6b6f6e6766757a69546f6b656e0000000000000000000000000000000000001a
2.18 getCode
web3.eth.getCode(address [, defaultBlock] [, callback])
返回指定以太坊地址(通常是合约地址)处的代码;
Parameters
-
String :address- 要读取的地址
-
Number|String :defaultBlock- 可选,使用该参数覆盖web3.eth.defaultBlock属性值
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getCode("0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602").then(console.log); //账号地址,返回0x
web3.eth.getCode("0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602").then(console.log); //合约地址,返回整个合约的bytecode,0x6080604052600436106100af576000357c0100........20029
2.19 getBlock
web3.eth.getBlock(blockHashOrBlockNumber [, returnTransactionObjects] [, callback])
通过区块号或区块哈希获取对应的块信息。
Parameters
-
String|Number :blockHash or blockNumber- 区块号或区块哈希值。
-
Boolean :returnTransactionObjects- 可选,默认值为false。当设置为true时,返回块中将包括所有交易详情,否则仅返回交易哈希。
Returns
一个Promise对象,其解析值为满足搜索条件的区块对象,具有以下字段:
-
number - Number: 块编号,处于pending状态的块为null
-
hash 32 Bytes - String: 块哈希,处于pending状态的块为null
-
parentHash 32 Bytes - String: 父块哈希
-
nonce 8 Bytes - String: 生成的proof-of-work的哈希,处于pending状态的块为null
-
sha3Uncles 32 Bytes - String: 块中叔伯数据的SHA3值
-
logsBloom 256 Bytes - String: 块中日志的bloom filter,处于pending状态的块为null
-
transactionsRoot 32 Bytes - String: 块中的交易树根节点
-
stateRoot 32 Bytes - String: 块中的最终状态树根节点
-
miner - String: 接收奖励的矿工地址
-
difficulty - String: 该块的难度值
-
totalDifficulty - String: 截至该块的全链总难度值
-
extraData - String: 块 “extra data” 字段
-
size - Number: 字节为单位的块大小
-
gasLimit - Number: 该块允许的最大gas值
-
gasUsed - Number: 该块中所有交易使用的gas总量
-
timestamp - Number: 出块的unix时间戳
-
transactions - Array: 交易对象数组,或者32字节长的交易哈希值,取决于returnTransactionObjects的设置
-
uncles - Array: 叔伯块哈希值数组
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getBlock(123456).then(console.log);
/*
{ difficulty: '2',
extraData:
'0xd88301090e846765746888676f312e31342e32856c696e757800000000000000fbeba116613305884a5777c34b363086ad78aa95df89c6adeaee35b3988feb2d68441792c211590278e8f6ff7dce44939fa9ebff5b166d56ee7dcb5464e3f49f00',
gasLimit: 8000000,
gasUsed: 0,
hash:
'0x763ac9f4656d79ec99c45634dcbc5ad1e87cf447fa8c36532bf7f96f22f95efe',
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
miner: '0x0000000000000000000000000000000000000000',
mixHash:
'0x0000000000000000000000000000000000000000000000000000000000000000',
nonce: '0x0000000000000000',
number: 123456,
parentHash:
'0xc9537757f0e63b0a72738984776378c12162560730fee0a69fd96dbb80edc875',
receiptsRoot:
'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
sha3Uncles:
'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
size: 609,
stateRoot:
'0x07fd2236ebc14cb11fd6696b05b9d93e7fed1fe05e7ec356307b08462d0b6215',
timestamp: 1590938171,
totalDifficulty: '211001',
transactions: [],
transactionsRoot:
'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
uncles: [] }
*/
web3.eth.getBlock("0xe4025dfba9210e94f7e44e82015a0bba01f97bec1790a7ee145b8a6e65c5b622").then(console.log);
/*
{ difficulty: '1',
extraData:
'0xd88301090e846765746888676f312e31342e32856c696e757800000000000000f0b17923e7c783dc6dc2a15ea798880298505afda350da1feb04f6d9089c6342420e48b7ca6b8572dc53446a49a767536d7852f877273fd80335d176e314b01401',
gasLimit: 8000000,
gasUsed: 1114009,
hash:
'0xe4025dfba9210e94f7e44e82015a0bba01f97bec1790a7ee145b8a6e65c5b622',
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000080000000000000000000010000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000200000002020000000000000000000000000000000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000',
miner: '0x0000000000000000000000000000000000000000',
mixHash:
'0x0000000000000000000000000000000000000000000000000000000000000000',
nonce: '0x0000000000000000',
number: 207111,
parentHash:
'0x712f16b98828e5232da0bf218348ed30bab9be95e8b3c50eaf352461202fdf45',
receiptsRoot:
'0xee55a9beb3a3cd48dcbe5a398e56c88cd3e75d60293fdea5b9e6b4ebdaeebca2',
sha3Uncles:
'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
size: 5936,
stateRoot:
'0x106f8885f29db87fa585fce93399d54b2fcd26262c759d5d9356ea81cc329527',
timestamp: 1591774721,
totalDifficulty: '322540',
transactions:
[ '0x7d376d4bf081382d27f55cbf4351e20ff0391607cdac2ed5dbb200add8b7ebf6' ],
transactionsRoot:
'0x3aa021842b20ff925fc47ed4c608d2284bdf5218267e51cfb6bf5a8dfac4dd41',
uncles: [] }
*/
2.20 getBlockTransactionCount
web3.eth.getBlockTransactionCount(blockHashOrBlockNumber [, callback])
通过区块号或区块哈希获取对应的交易数量。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getBlockTransactionCount(123456).then(console.log);
//0
web3.eth.getBlockTransactionCount("0xe4025dfba9210e94f7e44e82015a0bba01f97bec1790a7ee145b8a6e65c5b622").then(console.log);
//1
2.21 getBlockUncleCount
web3.eth.getBlockUncleCount(blockHashOrBlockNumber [, callback])
获取某个区块的叔块数量。
2.22 getUncle
web3.eth.getUncle(blockHashOrBlockNumber, uncleIndex [, returnTransactionObjects] [, callback])
获取某个叔块的信息,信息内容请参考2.19 getBlock。
2.23 getTransaction
web3.eth.getTransaction(transactionHash [, callback])
通过交易hash查询交易信息。
Returns
一个Promise对象,其解析值为具有给定哈希值的交易对象,该对象具有如下字段:
-
hash 32 Bytes - String: 交易的哈希值
-
nonce - Number: 交易发送方在此交易之前产生的交易数量
-
blockHash 32 Bytes - String: 交易所在块的哈希值。如果交易处于pending状态,则该值为null
-
blockNumber - Number: 交易所在块的编号,如果交易处于pending状态,则该值为null
-
transactionIndex - Number: 交易在块中的索引位置,如果交易处于pending状态,则该值为null
-
from - String: 交易发送方的地址
-
to - String: 交易接收方的地址。对于创建合约的交易,该值为null
-
value - String: 以wei为单位的转账金额
-
gasPrice - String: 发送方承诺的gas价格,以wei为单位
-
gas - Number: 发送方提供的gas用量
-
input - String: 随交易发送的数据
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getTransaction("0x0854f0450f4c7656c774f24f305a19c5a274f6ebe54779346c69ac9723a77065").then(console.log);
/*
{ blockHash:
'0x3c3d9f151b52b860c855e2d2f72807f2ca84712ce5b4a050a8c5fd32e4cf6b5c',
blockNumber: 26055,
from: '0x1e85D960a6fDcC5cb6Deaf6567Be527a1DD23602',
gas: 21000,
gasPrice: '1000000000',
hash:
'0x0854f0450f4c7656c774f24f305a19c5a274f6ebe54779346c69ac9723a77065',
input: '0x',
nonce: 0,
to: '0x6B7eeaa2fe6bD6C47fB6Ca3835305301C5e759D6',
transactionIndex: 0,
value: '1000000000000000000000000',
v: '0x42d',
r:
'0x8cb775a7c65b3474e2c24f068f9f9dae65cbe438fed8ba64f52631e818a60abe',
s:
'0x43223efb967e43ebed824a0e11c641e6a515cc5fb6c2ac5355fecd2e434ebdbe' }
*/
2.24 getPendingTransactions
web3.eth.getPendingTransactions([, callback])
查看处于pending状态的交易列表。信息内容参考2.23 getTransaction。
2.25 getTransactionFromBlock
getTransactionFromBlock(hashStringOrNumber, indexNumber [, callback])
返回某个区块指定序号的交易。信息内容参考2.23 getTransaction。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getTransactionFromBlock(26055,0).then(console.log); //第1笔交易
/*
{ blockHash:
'0x3c3d9f151b52b860c855e2d2f72807f2ca84712ce5b4a050a8c5fd32e4cf6b5c',
blockNumber: 26055,
from: '0x1e85D960a6fDcC5cb6Deaf6567Be527a1DD23602',
gas: 21000,
gasPrice: '1000000000',
hash:
'0x0854f0450f4c7656c774f24f305a19c5a274f6ebe54779346c69ac9723a77065',
input: '0x',
nonce: 0,
to: '0x6B7eeaa2fe6bD6C47fB6Ca3835305301C5e759D6',
transactionIndex: 0,
value: '1000000000000000000000000',
v: '0x42d',
r:
'0x8cb775a7c65b3474e2c24f068f9f9dae65cbe438fed8ba64f52631e818a60abe',
s:
'0x43223efb967e43ebed824a0e11c641e6a515cc5fb6c2ac5355fecd2e434ebdbe' }
*/
web3.eth.getTransactionFromBlock(26055,1).then(console.log); //第2笔交易
//null
2.26 getTransactionReceipt
web3.eth.getTransactionReceipt(hash [, callback])
获取指定交易的收据对象。 如果交易处于pending状态,则返回null。
Returns
一个Promise对象,其解析值为交易的收据对象或者null。收据对象具有如下字段:
-
status - Boolean: 成功的交易返回true,如果EVM回滚了该交易则返回false
-
blockHash 32 Bytes - String: 交易所在块的哈希值
-
blockNumber - Number: 交易所在块的编号
-
transactionHash 32 Bytes - String: 交易的哈希值
-
transactionIndex - Number: 交易在块中的索引位置
-
from - String: 交易发送方的地址
-
to - String: 交易接收方的地址,对于创建合约的交易,该值为null
-
contractAddress - String: 对于创建合约的交易,该值为创建的合约地址,否则为null
-
cumulativeGasUsed - Number: 该交易执行时所在块的gas累计总用量
-
gasUsed- Number: 该交易的gas总量
-
logs - Array: 该交易产生的日志对象数组
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getTransactionReceipt("0x0854f0450f4c7656c774f24f305a19c5a274f6ebe54779346c69ac9723a77065").then(console.log);
/*
{ blockHash:
'0x3c3d9f151b52b860c855e2d2f72807f2ca84712ce5b4a050a8c5fd32e4cf6b5c',
blockNumber: 26055,
contractAddress: null,
cumulativeGasUsed: 21000,
from: '0x1e85d960a6fdcc5cb6deaf6567be527a1dd23602',
gasUsed: 21000,
logs: [],
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: true,
to: '0x6b7eeaa2fe6bd6c47fb6ca3835305301c5e759d6',
transactionHash:
'0x0854f0450f4c7656c774f24f305a19c5a274f6ebe54779346c69ac9723a77065',
transactionIndex: 0 }
*/
2.27 getTransactionCount
web3.eth.getTransactionCount(address [, defaultBlock] [, callback])
指定地址发出的交易数量。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getTransactionCount("0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568").then(console.log);
//12
2.28 sendTransaction
web3.eth.sendTransaction(transactionObject [, callback])
Parameters
transactionObject:Object - 要发送的交易对象,包含以下字段:
-
from - String|Number: 交易发送方账户地址,不设置该字段的话,则使用web3.eth.defaultAccount属性值。可设置为一个地址或本地钱包web3.eth.accounts.wallet中的索引序号
-
to - String: 可选,消息的目标地址,对于合约创建交易该字段为null
-
value - Number|String|BN|BigNumber: 可选,交易的数量,单位wei
-
gas - Number: 可选,默认值:待定,用于交易的gas总量,未用完的gas会退还
-
gasPrice - Number|String|BN|BigNumber: 可选,该交易的gas价格,单位为wei,默认值为web3.eth.gasPrice属性值
-
data - String: 可选,可以是包含合约方法数据的ABI字符串,或者是合约创建交易中的初始化代码
-
nonce - Number: 可选,使用该字段覆盖使用相同nonce值的挂起交易
returns
PromiEvent: 一个整合事件发生器的Promise对象,将在收到交易收据后得到解析。
-
"transactionHash" 返回String: 在交易发出并得到有效的交易哈希值后立刻触发
-
"receipt" 返回Object: 当交易收据有效后立刻触发
-
"confirmation" 返回Number, Object: 在每次确认后立刻触发,最多12次确认。确认编号为第一个参数,收据为第二个参数。从0号确认开始触发
-
"error" 返回Error对象: 在发送交易的过程中如果出现错误则立刻触发。如果是out of gas错误,则传入第二个参数为交易收据
Example_1:含部署智能合约方法
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// compiled solidity source code using https://remix.ethereum.org
var code = "0x603d80600c6000396000f3007c01000000000000000000000000000000000000000000000000000000006000350463c6888fa18114602d57005b6007600435028060005260206000f3";
// using the callback
web3.eth.sendTransaction({
from: '0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568', // personal.unlockAccount("0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568","password",300)
data: code // deploying a contracrt
}, function(error, hash){
if (!error){
console.log("succeed: ", hash);
return hash;
}else{
console.log("error:", error);
}
});
//0x65f382e52263326754b62907efb85aa40ed2e6fedd3d27f7e40f702320f9e2f2
Example_2:含交易eth方法
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// using the promise
web3.eth.sendTransaction({
from: '0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568',
to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe',
value: '1000000000000000'
})
.then(function(receipt){
console.log(receipt);
});
/*
{ blockHash:
'0xe05057c39222457f99c52936ef4af94d72b27a6e5bc7c6486c7fb84302271fa6',
blockNumber: 215553,
contractAddress: null,
cumulativeGasUsed: 21000,
from: '0x38d8b866a1abebca20afc004622f5355eefeb568',
gasUsed: 21000,
logs: [],
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: true,
to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae',
transactionHash:
'0xf15d2e516ec5b3615ed2735fca88c92d602ea6a9cfde8ea47ffcdeb31a4682d2',
transactionIndex: 0 }
*/
Example_3:含区块确认
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// using the event emitter
web3.eth.sendTransaction({
from: '0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568',
to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe',
value: '1000000000000000'
})
.on('transactionHash', function(hash){
console.log(hash);
})
.on('receipt', function(receipt){
console.log(receipt);
})
.on('confirmation', function(confirmationNumber, receipt){
console.log(confirmationNumber);
})
.on('error', console.error); // If a out of gas error, the second parameter is the receipt.
/*
0x925a4f5459601fa7bdfb240a370e8090243901a5fc276d6f0408c6c91201f311
0
{ blockHash:
'0x73fbe08a69232deecd5307ec0b8c8c09460c8bbb0ab6edab98379e158fa653b6',
blockNumber: 215617,
contractAddress: null,
cumulativeGasUsed: 21000,
from: '0x38d8b866a1abebca20afc004622f5355eefeb568',
gasUsed: 21000,
logs: [],
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: true,
to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae',
transactionHash:
'0x925a4f5459601fa7bdfb240a370e8090243901a5fc276d6f0408c6c91201f311',
transactionIndex: 0 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*/
2.29 sendSignedTransaction
web3.eth.sendSignedTransaction(signedTransactionData [, callback])
用来发送已经签名的交易。可以使用web3.eth.accounts.signTransaction()
方法进行签名。
Parameters
- String :signedTransactionData- 16进制格式的签名交易数据
returns
- PromiEvent: 一个整合了事件发生器的Promise对象。当交易收据生效后得到解析。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// 请安装ethereumjs-tx@1.3.7;因为ethereumjs-tx@2.0.0版会报错:"(node:10440) UnhandledPromiseRejectionWarning: Error: Returned error: invalid sender"
// var Tx = require('ethereumjs-tx').Transaction; // 原文如此,使用版本ethereumjs-tx@1.3.7时取消.Transaction
var Tx = require('ethereumjs-tx');
var privateKey = Buffer.from('a6fe45540000bd3fed9a4794166577b6e62eb674004edc22a6554630d8515654', 'hex');
var rawTx = {
nonce: '0x15',
gasPrice: '0x09184e72a000000', // 本文实际测试时该值有增加,因为报错"(node:10520) UnhandledPromiseRejectionWarning: Error: Returned error: intrinsic gas too low"
gasLimit: '0x27100', // 本文实际测试时该值有增加,因为报错"(node:10520) UnhandledPromiseRejectionWarning: Error: Returned error: intrinsic gas too low"
to: '0x0297a8913cc187d60712f095a7e1bf2421bfcd40',
value: '0x100',
data: '0x010203040506070809'
}
var tx = new Tx(rawTx,{'chain':'ropsten'});
tx.sign(privateKey);
var serializedTx = tx.serialize();
console.log(serializedTx.toString('hex'));
// f87213879184e72b00000083027200940297a8913cc187d60712f095a7e1bf2421bfcd40820100890102030405060708091ca0e2bafcccd3215da81fa21075d52f80ce26abf82f81566bfc6e69f3b75cfc6461a050738216f3088587caa14bb7578923b21bd969a5ccd7b2a77bcc7f4581e0ffe3
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.on('receipt', console.log);
/*
{ blockHash:
'0x86048b8c11f9d63eb9eaaa2df01df561d6ba29245bd8ba9b273a09473f174458',
blockNumber: 223581,
contractAddress: null,
cumulativeGasUsed: 21144,
from: '0x38d8b866a1abebca20afc004622f5355eefeb568',
gasUsed: 21144,
logs: [],
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: true,
to: '0x0297a8913cc187d60712f095a7e1bf2421bfcd40',
transactionHash:
'0xe467cc585d2aefd9479b0ba54228e13f4150651294fe8dc597907f5b2697fe4d',
transactionIndex: 0 }
*/
自动获取nonce并发送签名交易:
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
//请安装ethereumjs-tx@1.3.7;因为ethereumjs-tx@2.0.0版会报错:"(node:10440) UnhandledPromiseRejectionWarning: Error: Returned error: invalid sender"
//var Tx = require('ethereumjs-tx').Transaction; //原文如此,使用版本ethereumjs-tx@1.3.7时取消.Transaction
var Tx = require('ethereumjs-tx');
var privateKey = Buffer.from('a6fe45540000bd3fed9a4794166577b6e62eb674004edc22a6554630d8515654', 'hex');
//私钥对应的账号地地址
const account = web3.eth.accounts.privateKeyToAccount("a6fe45540000bd3fed9a4794166577b6e62eb674004edc22a6554630d8515654");
const address = account.address;
console.log("address: ",address);
//address: 0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568
web3.eth.getTransactionCount(address,function(error, result){
if(!error){
//If no error occurred, return result
var nonce = result;
console.log('nonce :',nonce);
var rawTx = {
nonce: nonce,
gasPrice: '0x09184e72a000000', //本文实际测试时该值有增加,因为报错"(node:10520) UnhandledPromiseRejectionWarning: Error: Returned error: intrinsic gas too low"
gasLimit: '0x27100', //本文实际测试时该值有增加,因为报错"(node:10520) UnhandledPromiseRejectionWarning: Error: Returned error: intrinsic gas too low"
to: '0x0297a8913cc187d60712f095a7e1bf2421bfcd40',
value: '0x100',
data: '0x010203040506070809'
}
var tx = new Tx(rawTx,{'chain':'ropsten'});
tx.sign(privateKey);
var serializedTx = tx.serialize();
console.log(serializedTx.toString('hex'));
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.on('receipt', console.log);
}
else
//If an error occurred, handle it (throw, etc)
console.error(error);
})
2.30 sign
web3.eth.sign(dataToSign, address [, callback])
用指定的账户对数据进行签名,该账户必须先解锁。
Parameters
-
String :dataToSign- 待签名的数据。对于字符串将首先使用
web3.utils.utf8ToHex()
方法将其转换为16进制 -
String|Number :address- 用来签名的账户地址。或者本地钱包web3.eth.accounts.wallet中的地址或其序号
returns
- 一个Promise对象,其解析值为签名结果字符串。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.sign("Hello world", "0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568").then(console.log);
//0x553774cd3dccf9a5113d4a78a3c267c6dbeeecac719283924fdd0c5d420573d752e7679aafdc14f04c96c952fea622773def64f3e641f906dd221706537bba731b
// the below is the same
web3.eth.sign(web3.utils.utf8ToHex("Hello world"), "0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568").then(console.log);
//0x553774cd3dccf9a5113d4a78a3c267c6dbeeecac719283924fdd0c5d420573d752e7679aafdc14f04c96c952fea622773def64f3e641f906dd221706537bba731b
2.31 signTransaction
web3.eth.signTransaction(transactionObject, address [, callback])
对交易进行签名,用来签名的账户地址需要首先解锁。
Parameters
-
Object :transactionObject- 要签名的交易数据
-
String :address- 用于签名的账户地址
returns
- 一个Promise对象,其解析值为RLP编码的交易对象。该对象的raw属性可以用来通过
web3.eth.sendSignedTransaction()
方法来发送交易。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.signTransaction({
nonce: '25',
from: "0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568",
gasPrice: "20000000000",
gas: "21000",
to: "0x0297a8913cc187d60712f095a7e1bf2421bfcd40",
value: "100",
data: ""
}).then(console.log);
/*
{ raw:
'0xf865198504a817c800825208940297a8913cc187d60712f095a7e1bf2421bfcd40648082042ea0f3f0de7828a76cf9b06459b5c4fda4a26cb3101bf9441d43c71c8c5790e5867e9fe0cc9821a8811ed111176fe92ef4304a1f1f3e9ee8bd1ebf9ee519ae484c0a',
tx:
{ nonce: '0x19',
gasPrice: '0x4a817c800',
gas: '0x5208',
to: '0x0297a8913cc187d60712f095a7e1bf2421bfcd40',
value: '0x64',
input: '0x',
v: '0x42e',
r:
'0xf3f0de7828a76cf9b06459b5c4fda4a26cb3101bf9441d43c71c8c5790e5867e',
s:
'0xe0cc9821a8811ed111176fe92ef4304a1f1f3e9ee8bd1ebf9ee519ae484c0a',
hash:
'0x27b4b94ca62e04f3ac470b77bc2a2118d531f8be318e2c99a4bce14a123102b6' } }
*/
2.32 call
web3.eth.call(callObject [, defaultBlock] [, callback])
执行一个消息调用交易,消息调用交易直接在节点EVM中执行,而不需要通过区块链的挖矿来执行。
Parameters
-
Object :callObject- 交易对象,消息调用交易的from属性可选
-
Number|String :defaultBlock- 可选,使用该参数来覆盖默认的web3.eth.defaultBlock属性值
returns
- 一个Promise对象,其解析值为调用方法的返回数据字符串
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.call({
to: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", // contract address
data: "0xc6888fa10000000000000000000000000000000000000000000000000000000000000003"
})
.then(console.log);
// "0x000000000000000000000000000000000000000000000000000000000000000a"
2.33 getChainId
web3.eth.getChainId([callback])
当前连接的节点的chainId;有时叫networkId。
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getChainId().then(console.log); //517
2.34 getNodeInfo
web3.eth.getNodeInfo([callback])
节点信息。
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getNodeInfo().then(console.log);
//Geth/v1.9.14-stable-6d74d1e5/windows-amd64/go1.14.2
2.35 getProof
web3.eth.getProof(address, storageKey, blockNumber, [callback])
返回指定帐户和存储值,包括EIP-1186中描述的Merkle证明。
Parameters
-
String 20 Bytes: 账号地址或合约地址
-
Number[] | BigNumber[] | BN[] | String[] 32 Bytes: 存储-键值对列表
-
Number | String | BN | BigNumber: 区块号,可以是"latest", "earliest", 或 "genesis"
returns
对象 - 一个账号对象
-
address - String: 账号地址
-
balance - String: 账号余额
-
codeHash - String: code的哈希值
-
nonce - String: 账号Nonce值,交易数量
-
storageHash - String: 存储根测SHA3值,所有存储都将从这个根哈希开始提供merkle证明
-
accountProof - String[]: rlp序列化的Merkle树节点的数组,从状态根节点开始,以SHA3(地址)的路径作为键值
-
storageProof - Object[] :请求的存储项数组
- key - String : 请求的存储键
- value - String :存储值
Example
var Web3= require('web3');
var web3= new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.getProof(
"0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568",
["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"],
"latest"
).then(console.log);
/*
{ address: '0x38D8B866a1ABeBcA20AFC004622F5355EeFEB568',
accountProof:
[ '0xf90131a0d67d35b003bcf010b083b765b273c337a14a6f349828815112dcdec77f2571a280a045e72ac735382c4fa9f7a176f34448c5bac9b920786dfbf612a49e2fdb0f8717a031c1eb791903907c7a0a876b796458f535aa769e361c54a933b457fcdf03dba780a0f797a10951c333c988e967204721aa436a78964c02bb5153b3897bbc3a3ca91c80a044b2fccca4176a61f8e360a6d94acc65490336e51f1678e1a85fceb9d67923aa80a0026e45a01956f0c2c0e847b02d200c1522e1fe5303ce31012c48c9db52b6c18080a06cb01cdb809d58854f932a278a58c255f7cadafbf87852f650ca363040e514db80a0ced141fc6a4a9247aa66bd8f8e724b6edf66c8d2fac6de056e051a69e7316425a0854ff34e11b0f6053ed6741da516fea9384c80d77509fc041b5e50548d08223a8080',
'0xf873a0328d3473fa6a5032862dd15a1b9bba23613feb4ca64593dac016c16a028e1316b850f84e198ad278fe7c4a012aede200a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' ],
balance: '993928908304622262542848',
codeHash:
'0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470',
nonce: '25',
storageHash:
'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
storageProof:
[ { key: '0x0', value: '0x0', proof: [] },
{ key: '0x1', value: '0x0', proof: [] } ] }
*/