如何使用 Etherscan 的 API
雖然以太坊提供了 Web3 和 Json Rpc 這 2 種 API,geth 也額外提供了一些 API,但是對于開發以太坊應用來說還是顯得有些不足,比如說獲取交易記錄的時間,需要先通過交易的 hash 找到該交易對應的區塊 id,然后才能找到對應的時間,查詢起來相當不方便。
好在Etherscan
對外提供了一些公共的 API,給我們提供了額外的能力來處理更多的業務場景。
Etherscan api
為了方便開發人員更好地使用ethersacn.io
,網站提供了一系列 API 供開發人員使用。
使用方法
API 的使用非常簡單,基本上都是 get 方法,通過 http 請求就可以直接調用,在每個 Api 的說明文檔都有對應的例子可以查看。
模塊介紹
API 主要包含以下模塊:賬號、智能合約、交易、區塊、事件日志、代幣及工具等。
賬號 API
賬號相關的 API,有獲取賬號金額,獲取交易記錄等,該模塊提供的 API 最多。
獲取單個賬號金額
API 示例
參數說明
- module:對應的模塊名稱,這里是賬戶模塊,所以是
moudle=account
- action:對應的操作,這里是
balance
,即獲取金額。 - address:要查詢金額的賬號地址。
- tag:之前在介紹 geth 的 API 時講過獲取賬號金額需要 2 個參數,一個是賬號地址,另外一個就是 tag,一般寫
latest
就可以了。 - apikey:你在
Etherscan
上創建的 apikey,帶上沒有請求的限制,也可以不帶,下面會介紹 API 的請求限制。
其中module、action、apikey
是每個 API 都有的參數,其他的參數則因不同 API 而不同。
返回結果
{"status":"1","message":"OK","result":"670456215218885498951364"}
獲取多個賬號金額
API 示例
參數說明
(前面有講過的參數就不講了,下同)
與單個賬號金額 API 相比,參數address
用,
號分隔多個賬號,最多可支持 20 個賬號的金額查詢。
返回結果
{
"message": "OK",
"result": [
{
"account": "0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a",
"balance": "40807168564070000000000"
},
{
"account": "0x63a9975ba31b0b9626b34300f7f627147df1f526",
"balance": "332567136222827062478"
},
{
"account": "0x198ef1ec325a96cc354c7266a038be8b5c558f67",
"balance": "0"
}
],
"status": "1"
}
獲取”正常”交易記錄
API 示例
參數說明
- action:為
txlist
,表示列出交易記錄。 - address:要查詢交易記錄的賬號地址。
- startblock:起始查詢塊 id,可選,默認值為 0。
- endblock:結束查詢塊 id,可選,默認值為最后一個區塊。
- page: 頁數(沒錯,這個 API 還支持分頁),可選。
- offset: 查詢到記錄數,可選,默認是查詢 10000 條記錄。
- sort: 排序規則,可以正序
asc
和倒序desc
。
返回結果
{
"message": "OK",
"result": [
{
"blockHash": "0x2d0a9228f22fe85596d246040d4fd7dc6b1a55920bae02b68e731d55a890b315",
"blockNumber": "47894",
"confirmations": "5435815",
"contractAddress": "",
"cumulativeGasUsed": "21612",
"from": "0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a",
"gas": "23000",
"gasPrice": "400000000000",
"gasUsed": "21612",
"hash": "0x7e1503d2001cab2f432b56a62a3ee874782c8e33cbd79a664d155a758c1784a2",
"input": "0x454e34354139455138",
"isError": "0",
"nonce": "1",
"timeStamp": "1438948043",
"to": "0x2910543af39aba0cd09dbb2d50200b3e800a63d2",
"transactionIndex": "0",
"txreceipt_status": "",
"value": "9001000000000000000000"
},
],
"status": "1"
}
獲取”內部”交易記錄
API 示例
參數說明
參數與上一個 API 基本相同,只有action
是txlistinternal
這一點不同,這 2 種交易的區別是什么呢?簡單的理解就是“正常”的交易是會記錄到區塊鏈上的,而“內部”交易是指不會記錄到區塊鏈上的記錄,比如交易失敗的記錄。
另外這個 API 還可以通過交易 hash 查看交易的詳情。
返回結果
{
"message": "OK",
"result": [
{
"blockNumber": "2547619",
"contractAddress": "",
"errCode": "Bad jump destination",
"from": "0x2c1ba59d6f58433fb1eaee7d20b26ed83bda51a3",
"gas": "346878",
"gasUsed": "0",
"hash": "0x2896441f9d1f167b4a3f987d82233e7d238e6a50a227c4b612dbc82f34bb533d",
"input": "",
"isError": "1",
"timeStamp": "1478013203",
"to": "0x20d42f2e99a421147acf198d775395cac2e8b03d",
"traceId": "0",
"type": "call",
"value": "71000000000000000000"
},
],
"status": "1"
}
獲取 ERC20 代幣交易事件記錄
API 示例
https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2&address=0x4e83362442b8d1bec281594cea3050c8eb01311c&page=1&offset=100&sort=asc&apikey=YourApiKeyToken
參數說明
- action: 值為
tokentx
,表示查詢代幣交易記錄。 - contractaddress: 代幣的智能合約地址。
- address: 只查詢和該賬戶地址相關的記錄,可選。
返回結果
{
"message": "OK",
"result": [
{
"blockHash": "0xb3ff25909ae9ae5b65baecab1114dff885fbd5a1607081229ea50b6a2db13ae8",
"blockNumber": "5278009",
"confirmations": "205861",
"contractAddress": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2",
"cumulativeGasUsed": "1050219",
"from": "0x4e83362442b8d1bec281594cea3050c8eb01311c",
"gas": "191157",
"gasPrice": "4000000000",
"gasUsed": "97646",
"hash": "0x497f15095877bc06b9e0f422673c1e0f13a2b4224b615ef29ce8c46e249364d1",
"input": "0x73b38101000000000000000000000000000000000000000000000000000000000000003d0000000000000000000000000000000000000000000046aefaa28844d7d839d7",
"nonce": "730",
"timeStamp": "1521386734",
"to": "0x69076e44a9c70a67d5b79d95795aba299083c275",
"tokenDecimal": "18",
"tokenName": "Maker",
"tokenSymbol": "MKR",
"transactionIndex": "28",
"value": "553365126770755906"
},
],
"status": "1"
}
獲取已開采的區塊列表
API 示例
https://api.etherscan.io/api?module=account&action=getminedblocks&address=0x9dd134d14d1e65f84b706d6f205cd5b1cd03a46b&blocktype=blocks&page=1&offset=10&apikey=YourApiKeyToken
參數說明
- action: 值為
getminedblocks
。 - blocktype:區塊類型,可以選區塊
blocks
和叔塊uncles
,不了解叔塊的可以查看這里。
返回結果
{
"message": "OK",
"result": [
{
"blockNumber": "3462296",
"blockReward": "5194770940000000000",
"timeStamp": "1491118514"
},
],
"status": "1"
}
合同 API
智能合約相關的 API,其實只有一個獲取智能合約接口的 API,但是這個 API 非常有用。
獲取智能合約接口
API 示例
https://api.etherscan.io/api?module=contract&action=getabi&address=0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413&apikey=YourApiKeyToken
參數說明
- module: 值為
contract
。 - action: 值為
getabi
。 - address: 智能合約地址。
智能合約的 abi 就是一個 json 對象,通過這個對象我們可以調用其接口方法,后面會寫一篇文章介紹如何操作 abi 對象,敬請期待。
返回結果
返回結果內容比較長,這里省略,就是一個 json 對象,感興趣的可以自行調用該 API 看結果。
使用限制
賬號和智能合約的 API 已經能滿足大部分的業務需求了,其他模塊的 API 感覺沒什么太大的作用,這里就不介紹了,感興趣的讀者可以自行查閱。
這里再說下 API 的使用限制,剛才提到每個 API 都有一個apikey
參數,如果 API 沒加上這個參數的話,每個 API 的請求次數不能超過 5 次每秒。
總結
Etherscan
提供的這些 API 有些是和以太坊提供的 API 有重復的,比如說獲取賬號金額,獲取事件日志記錄等,但有一些 API 給我們帶來了很大的便利性,比如獲取賬號交易記錄,有了這個 API 就不用使用幾個原生 API 進行各種數據拼接了。
另外Etherscan
的這套 API 在 Rinkeby 測試網絡也有一套一模一樣的,區別只是前面的 url 不同,Rinkeby 的是:api-rinkeby.etherscan.io
,感興趣的同學可以去試試。