JSON-RPC API
為了讓軟體應用程式能夠與 以太坊 區塊鏈互動(無論是讀取區塊鏈資料還是發送交易到網路),它必須連接到一個以太坊節點。
為此,每個 以太坊客戶端 都實作了 JSON-RPC 規範 (opens in a new tab),因此無論具體的節點或客戶端實作為何,應用程式都可以依賴一組統一的方法。
JSON-RPC (opens in a new tab) 是一種無狀態、輕量級的遠端程序呼叫 (RPC) 協定。它定義了幾種資料結構及其處理規則。它與傳輸方式無關,因為這些概念可以用於同一個行程內、透過 Socket、透過 HTTP,或在許多不同的訊息傳遞環境中。它使用 JSON (RFC 4627) 作為資料格式。
客戶端實作
以太坊客戶端在實作 JSON-RPC 規範時,各自可能會使用不同的程式語言。請參閱個別的客戶端文件,以了解關於特定程式語言的更多詳細資訊。我們建議查看各個客戶端的文件,以獲取最新的 API 支援資訊。
便利函式庫
雖然您可以選擇透過 JSON-RPC API 直接與以太坊客戶端互動,但對於去中心化應用程式 (dapp) 開發者來說,通常有更簡單的選擇。有許多 JavaScript 和後端 API 函式庫在 JSON-RPC API 之上提供封裝。藉由這些函式庫,開發者可以使用他們選擇的程式語言編寫直觀的單行方法,從而在底層初始化與以太坊互動的 JSON-RPC 請求。
共識客戶端 API
本頁面主要探討以太坊執行客戶端所使用的 JSON-RPC API。然而,共識客戶端也有一個 RPC API,允許使用者直接從節點查詢有關節點的資訊、請求信標區塊、信標狀態以及其他與共識相關的資訊。此 API 記錄在 Beacon API 網頁 (opens in a new tab)上。
節點內部的客戶端之間通訊也使用了一個內部 API——也就是說,它使共識客戶端和執行客戶端能夠交換資料。這被稱為「引擎 API (Engine API)」,其規格可在 GitHub (opens in a new tab) 上取得。
執行客戶端規範
在 GitHub 上閱讀完整的 JSON-RPC API 規範 (opens in a new tab)。此 API 記錄在執行 API 網頁 (opens in a new tab)上,並包含一個檢查器 (Inspector) 以供試用所有可用的方法。
慣例
十六進位值編碼
有兩種關鍵資料類型透過 JSON 傳遞:未格式化的位元組陣列和數量。兩者都以十六進位編碼傳遞,但格式化要求不同。
數量
編碼數量(整數、數字)時:編碼為十六進位,加上「0x」前綴,使用最精簡的表示法(小例外:零應表示為「0x0」)。
以下是一些範例:
- 0x41(十進位的 65)
- 0x400(十進位的 1024)
- 錯誤:0x(應始終至少有一位數 - 零為「0x0」)
- 錯誤:0x0400(不允許前導零)
- 錯誤:ff(必須加上 0x 前綴)
未格式化資料
編碼未格式化資料(位元組陣列、帳戶地址、雜湊、位元組碼陣列)時:編碼為十六進位,加上「0x」前綴,每個位元組兩個十六進位數字。
以下是一些範例:
- 0x41(大小為 1,「A」)
- 0x004200(大小為 3,「0B0」)
- 0x(大小為 0,「」)
- 錯誤:0xf0f0f(必須是偶數位數)
- 錯誤:004200(必須加上 0x 前綴)
區塊參數
以下方法具有區塊參數:
當發出查詢以太坊狀態的請求時,提供的區塊參數決定了區塊的高度。
區塊參數有以下選項:
HEX String- 整數區塊號碼String "earliest"代表最早/創世區塊String "latest"- 代表最新提議的區塊String "safe"- 代表最新安全的頭部區塊String "finalized"- 代表最新已定案的區塊String "pending"- 代表待處理的狀態/交易
範例
在此頁面中,我們提供了如何使用命令列工具 curl (opens in a new tab) 來使用個別 JSON_RPC API 端點的範例。這些個別端點的範例可以在下方的 Curl 範例 章節中找到。在頁面更下方,我們還提供了一個端到端範例,示範如何使用 Geth 節點、JSON_RPC API 以及 curl 來編譯與部署智能合約。
Curl 範例
以下提供透過向以太坊節點發送 curl (opens in a new tab) 請求來使用 JSON_RPC API 的範例。每個範例都包含特定端點的描述、其參數、回傳類型,以及如何使用的實際操作範例。
curl 請求可能會回傳與內容類型相關的錯誤訊息。這是因為 --data 選項會將內容類型設定為 application/x-www-form-urlencoded。如果您的節點出現此錯誤,請在呼叫的開頭加上 -H "Content-Type: application/json" 來手動設定標頭。這些範例也沒有包含 URL/IP 與通訊埠組合,這必須是提供給 curl 的最後一個參數(例如:127.0.0.1:8545)。包含這些額外資料的完整 curl 請求格式如下:
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545
Gossip、狀態與歷史
少數幾個核心的 JSON-RPC 方法需要來自以太坊網路的資料,並可清楚分為三個主要類別:Gossip、狀態與歷史。使用這些章節中的連結跳轉至各個方法,或使用目錄來探索完整的方法列表。
Gossip 方法
這些方法會追蹤鏈的頂端。這就是交易在網路中傳播、被納入區塊,以及客戶端發現新區塊的方式。
狀態方法
報告所有已儲存資料當前狀態的方法。「狀態」就像一塊巨大的共享記憶體 (RAM),包含帳戶餘額、合約資料以及燃料估算。
歷史方法
獲取追溯至創世區塊的每個區塊歷史紀錄。這就像一個巨大的僅限附加 (append-only) 檔案,包含所有區塊標頭、區塊主體、叔區塊以及交易收據。
- eth_getBlockTransactionCountByHash
- eth_getBlockTransactionCountByNumber
- eth_getUncleCountByBlockHash
- eth_getUncleCountByBlockNumber
- eth_getBlockByHash
- eth_getBlockByNumber
- eth_getTransactionByHash
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getTransactionReceipt
- eth_getUncleByBlockHashAndIndex
- eth_getUncleByBlockNumberAndIndex
JSON-RPC API 遊樂場
您可以使用遊樂場工具 (opens in a new tab)來探索並試用 API 方法。它還會向您顯示各種節點供應商支援哪些方法與網路。
JSON-RPC API 方法
web3_clientVersion
回傳目前的客戶端版本。
參數
無
回傳
String - 目前的客戶端版本
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'
// 結果
{
"id":67,
"jsonrpc":"2.0",
"result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"
}
web3_sha3
回傳給定資料的 Keccak-256(不是 標準化的 SHA3-256)。
參數
DATA- 要轉換為 SHA3 雜湊值的資料
params: ["0x68656c6c6f20776f726c64"]
回傳值
DATA - 給定字串的 SHA3 結果。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
// 結果
{
"id":64,
"jsonrpc": "2.0",
"result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
}
net_version
回傳目前的網路 ID。
參數
無
回傳值
String - 目前的網路 ID。
目前網路 ID 的完整清單可在 chainlist.org (opens in a new tab) 取得。一些常見的包括:
1:以太坊主網11155111:Sepolia 測試網560048:Hoodi 測試網
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
// 結果
{
"id":67,
"jsonrpc": "2.0",
"result": "3"
}
net_listening
如果客戶端正在主動監聽網路連線,則回傳 true。
參數
無
回傳值
Boolean - 監聽時為 true,否則為 false。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
// 結果
{
"id":67,
"jsonrpc":"2.0",
"result":true
}
net_peerCount
回傳目前連接到客戶端的對等節點數量。
參數
無
回傳值
QUANTITY - 已連接對等節點數量的整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
// 結果
{
"id":74,
"jsonrpc": "2.0",
"result": "0x2" // 2
}
eth_protocolVersion
回傳目前的以太坊協定版本。請注意,此方法在 Geth 中無法使用 (opens in a new tab)。
參數
無
回傳
String - 目前的以太坊協定版本
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
// 結果
{
"id":67,
"jsonrpc": "2.0",
"result": "54"
}
eth_syncing
傳回包含同步狀態資料的物件,或 false。
參數
無
傳回值
確切的傳回資料因客戶端實作而異。當節點未在同步時,所有客戶端都會傳回 False,且所有客戶端都會傳回以下欄位。
Object|Boolean,包含同步狀態資料的物件,或在未同步時傳回 FALSE:
startingBlock:QUANTITY- 開始匯入的區塊(只有在同步到達其頂端後才會重設)currentBlock:QUANTITY- 目前的區塊,與 eth_blockNumber 相同highestBlock:QUANTITY- 估計的最高區塊
然而,個別客戶端也可能提供額外的資料。例如,Geth 會傳回以下內容:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"currentBlock": "0x3cf522",
"healedBytecodeBytes": "0x0",
"healedBytecodes": "0x0",
"healedTrienodes": "0x0",
"healingBytecode": "0x0",
"healingTrienodes": "0x0",
"highestBlock": "0x3e0e41",
"startingBlock": "0x3cbed5",
"syncedAccountBytes": "0x0",
"syncedAccounts": "0x0",
"syncedBytecodeBytes": "0x0",
"syncedBytecodes": "0x0",
"syncedStorage": "0x0",
"syncedStorageBytes": "0x0"
}
}
而貝蘇 (Besu) 則傳回:
{
"jsonrpc": "2.0",
"id": 51,
"result": {
"startingBlock": "0x0",
"currentBlock": "0x1518",
"highestBlock": "0x9567a3",
"pulledStates": "0x203ca",
"knownStates": "0x200636"
}
}
請參閱您特定客戶端的說明文件以了解更多詳細資訊。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": {
startingBlock: '0x384',
currentBlock: '0x386',
highestBlock: '0x454'
}
}
// 或未同步時
{
"id":1,
"jsonrpc": "2.0",
"result": false
}
eth_coinbase
回傳客戶端 Coinbase 地址。
在測試區中嘗試端點 (opens in a new tab)注意: 此方法自 v1.14.0 起已棄用,且不再受到支援。嘗試使用此方法將導致「Method not supported」錯誤。
參數
無
回傳值
DATA,20 個位元組 - 目前的 Coinbase 地址。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'
// 結果
{
"id":64,
"jsonrpc": "2.0",
"result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
}
eth_chainId
回傳用於簽署防重放交易的鏈 ID。
在遊樂場中嘗試端點 (opens in a new tab)參數
無
回傳值
chainId,以字串表示的十六進位值,代表目前鏈 ID 的整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'
// 結果
{
"id":67,
"jsonrpc": "2.0",
"result": "0x1"
}
eth_mining
如果客戶端正在積極挖礦產生新區塊,則回傳 true。這只能在工作量證明網路中回傳 true,且自合併以來,在某些客戶端中可能無法使用。
參數
無
回傳值
Boolean - 如果客戶端正在挖礦則回傳 true,否則回傳 false。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'
//
{
"id":71,
"jsonrpc": "2.0",
"result": true
}
eth_hashrate
回傳節點挖礦時每秒的雜湊次數。這只能在工作量證明網路中回傳 true,且自合併以來,在某些客戶端中可能無法使用。
參數
無
回傳值
QUANTITY - 每秒的雜湊次數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'
// 結果
{
"id":71,
"jsonrpc": "2.0",
"result": "0x38a"
}
eth_gasPrice
回傳以 Wei 為單位的當前每單位 Gas 價格估算值。例如,貝蘇客戶端預設會檢查過去 100 個區塊,並回傳 Gas 單位價格的中位數。
在遊樂場中嘗試端點 (opens in a new tab)參數
無
回傳值
QUANTITY - 以 Wei 為單位的當前 Gas 價格整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
// 結果
{
"id":73,
"jsonrpc": "2.0",
"result": "0x1dfd14000" // 8049999872 Wei
}
eth_accounts
回傳由客戶端擁有的地址列表。
在遊樂場中嘗試端點 (opens in a new tab)參數
無
回傳
Array of DATA,20 位元組 - 由客戶端擁有的地址。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
}
eth_blockNumber
回傳最新區塊的編號。
在遊樂場中嘗試端點 (opens in a new tab)參數
無
回傳值
QUANTITY - 客戶端目前所在區塊編號的整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
// 結果
{
"id":83,
"jsonrpc": "2.0",
"result": "0x4b7" // 1207
}
eth_getBalance
回傳指定地址帳戶的餘額。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,20 位元組 - 要檢查餘額的地址。QUANTITY|TAG- 整數區塊號碼,或字串"latest"、"earliest"、"pending"、"safe"或"finalized",請參閱區塊參數
params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]
回傳值
QUANTITY - 目前餘額的整數,單位為 Wei。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x0234c8a3397aab58" // 158972490234375000
}
eth_getStorageAt
傳回給定地址中儲存位置的值。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,20 位元組 - 儲存的地址。QUANTITY- 儲存位置的整數。QUANTITY|TAG- 整數區塊號碼,或是字串"latest"、"earliest"、"pending"、"safe"、"finalized",請參閱區塊參數
傳回值
DATA - 該儲存位置的值。
範例
計算正確的位置取決於要擷取的儲存內容。考慮以下由地址 0x391694e7e0b0cce554cb130d723a9d27458f9298 部署在 0x295a70b2de5e3953354a6a8344e616ed314d7251 的合約。
contract Storage {
uint pos0;
mapping(address => uint) pos1;
constructor() {
pos0 = 1234;
pos1[msg.sender] = 5678;
}
}
擷取 pos0 的值很簡單:
curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}
擷取映射 (map) 的元素比較困難。映射中元素的位置計算方式如下:
keccak(LeftPad32(key, 0), LeftPad32(map position, 0))
這表示要擷取 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 上的儲存內容,我們需要使用以下方式計算位置:
keccak(
decodeHex(
"000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
"0000000000000000000000000000000000000000000000000000000000000001"
)
)
可以使用 Web3 函式庫隨附的 geth 主控台來進行計算:
> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
現在來擷取儲存內容:
curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545
{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}
eth_getTransactionCount
傳回從某個地址_發送_的交易數量。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,20 位元組 - 地址。QUANTITY|TAG- 整數區塊號碼,或是字串"latest"、"earliest"、"pending"、"safe"或"finalized",請參閱區塊參數
params: [
"0x407d73d8a49eeb85d32cf465507dd71d507100c1",
"latest", // 最新區塊的狀態
]
傳回值
QUANTITY - 整數,表示從此地址發送的交易數量。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_getBlockTransactionCountByHash
回傳符合給定區塊雜湊值的區塊中的交易數量。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,32 位元組 - 區塊的雜湊值
params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]
回傳值
QUANTITY - 整數,表示此區塊中的交易數量。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x8b" // 139
}
eth_getBlockTransactionCountByNumber
傳回符合給定區塊編號的區塊中的交易數量。
在遊樂場中嘗試端點 (opens in a new tab)參數
QUANTITY|TAG- 區塊編號的整數,或是字串"earliest"、"latest"、"pending"、"safe"或"finalized",如同 區塊參數。
params: [
"0x13738ca", // 20396234
]
回傳值
QUANTITY - 此區塊中交易數量的整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x8b" // 139
}
eth_getUncleCountByBlockHash
回傳符合給定區塊雜湊值的區塊中,其叔塊的數量。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,32 位元組 - 區塊的雜湊值
params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]
回傳值
QUANTITY - 整數,表示此區塊中的叔塊數量。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_getUncleCountByBlockNumber
回傳符合給定區塊編號的區塊中的叔塊數量。
在遊樂場中嘗試端點 (opens in a new tab)參數
QUANTITY|TAG- 區塊編號的整數,或是字串"latest"、"earliest"、"pending"、"safe"或"finalized",請參閱區塊參數
params: [
"0xe8", // 232
]
回傳值
QUANTITY - 該區塊中叔塊數量的整數。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x0" // 0
}
eth_getCode
回傳給定地址的程式碼。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,20 位元組 - 地址QUANTITY|TAG- 整數區塊編號,或字串"latest"、"earliest"、"pending"、"safe"或"finalized",請參閱區塊參數
params: [
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0x5daf3b", // 6139707
]
回傳值
DATA - 來自給定地址的程式碼。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"
}
eth_sign
sign 方法計算以太坊特定的簽章,使用:sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))。
透過在訊息中加入前綴,可讓計算出的簽章被識別為以太坊特定的簽章。這可以防止濫用,避免惡意的去中心化應用程式 (dapp) 簽署任意資料(例如:交易),並使用該簽章來冒充受害者。
注意:用於簽署的地址必須處於解鎖狀態。
參數
DATA,20 位元組 - 地址DATA,N 位元組 - 要簽署的訊息
回傳值
DATA:簽章
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}
eth_signTransaction
簽署一筆交易,該交易稍後可以使用 eth_sendRawTransaction 提交至網路。
參數
Object- 交易物件
type:from:DATA, 20 位元組 - 發送交易的地址。to:DATA, 20 位元組 - (建立新合約時為選填)交易指向的地址。gas:QUANTITY- (選填,預設值:90000)為執行交易提供的燃料整數。它將退回未使用的燃料。gasPrice:QUANTITY- (選填,預設值:待定)每個支付的燃料所使用的 Gas 價格整數,單位為 Wei。value:QUANTITY- (選填)隨此交易發送的價值整數,單位為 Wei。data:DATA- 合約的編譯程式碼,或被呼叫方法簽章與編碼後參數的雜湊值。nonce:QUANTITY- (選填)隨機數的整數。這允許覆寫您自己使用相同隨機數的待處理交易。
回傳值
DATA,由指定帳戶簽署、經 RLP 編碼的交易物件。
範例
// 請求
curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}'
// 結果
{
"id": 1,
"jsonrpc": "2.0",
"result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}
eth_sendTransaction
創建新的訊息呼叫交易或合約創建(如果資料欄位包含程式碼),並使用 from 中指定的帳戶對其進行簽署。
參數
Object- 交易物件
from:DATA,20 位元組 - 發送交易的地址。to:DATA,20 位元組 - (創建新合約時為選填)交易指向的地址。gas:QUANTITY- (選填,預設值:90000)為執行交易提供的燃料整數。它將退回未使用的燃料。gasPrice:QUANTITY- (選填,預設值:待定)每個支付的燃料所使用的 gasPrice 整數。value:QUANTITY- (選填)與此交易一起發送的金額整數。input:DATA- 合約的編譯程式碼,或是被呼叫方法簽章與編碼後參數的雜湊值。nonce:QUANTITY- (選填)隨機數的整數。這允許覆寫您自己使用相同隨機數的待處理交易。
params: [
{
from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
gas: "0x76c0", // 30400
gasPrice: "0x9184e72a000", // 10000000000000
value: "0x9184e72a", // 2441406250
input:
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
},
]
回傳值
DATA,32 位元組 - 交易雜湊值,如果交易尚不可用,則為零雜湊。
當您創建合約時,請在交易被提議到區塊後,使用 eth_getTransactionReceipt 來取得合約地址。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
eth_sendRawTransaction
為已簽署的交易建立新的訊息呼叫交易或合約創建。
參數
DATA,已簽署的交易資料。
params: [
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
]
回傳值
DATA,32 位元組 - 交易雜湊值,如果交易尚未可用,則為零雜湊值。
當你創建合約時,在交易被提議到區塊後,請使用 eth_getTransactionReceipt 來取得合約地址。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}
eth_call
立即執行新的訊息呼叫,而不在區塊鏈上建立交易。通常用於執行唯讀的智能合約函式,例如 ERC-20 合約的 balanceOf。
參數
Object- 交易呼叫物件
from:DATA,20 Bytes - (選填)發送交易的地址。to:DATA,20 Bytes - 交易指向的地址。gas:QUANTITY- (選填)為交易執行所提供燃料的整數。eth_call 消耗零燃料,但某些執行可能需要此參數。gasPrice:QUANTITY- (選填)用於每個支付燃料的 gasPrice 整數value:QUANTITY- (選填)隨此交易發送之值的整數input:DATA- (選填)方法簽章與編碼參數的雜湊。詳情請見 Solidity 文件中的以太坊合約 ABI (opens in a new tab)。
QUANTITY|TAG- 整數區塊號碼,或字串"latest"、"earliest"、"pending"、"safe"或"finalized",請參閱區塊參數
回傳值
DATA - 已執行合約的回傳值。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x"
}
eth_estimateGas
產生並回傳讓交易完成所需燃料的估算值。該交易不會被加入到區塊鏈中。請注意,由於 EVM 機制和節點效能等多種原因,估算值可能會明顯高於交易實際使用的燃料量。
在遊樂場中嘗試端點 (opens in a new tab)參數
請參閱 eth_call 的參數,差別在於所有屬性皆為選填。如果未指定 Gas 限制,Geth 會使用待處理區塊的區塊 Gas 限制作為上限。因此,當燃料量高於待處理區塊的 Gas 限制時,回傳的估算值可能不足以執行該呼叫/交易。
回傳值
QUANTITY - 使用的燃料量。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x5208" // 21000
}
eth_getBlockByHash
透過雜湊值回傳區塊的相關資訊。
在遊樂場中測試端點 (opens in a new tab)參數
DATA,32 Bytes - 區塊的雜湊值。Boolean- 如果為true,則回傳完整的交易物件;如果為false,則僅回傳交易的雜湊值。
params: [
"0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
false,
]
回傳值
Object - 一個區塊物件,如果未找到區塊則回傳 null:
number:QUANTITY- 區塊號碼。當其為待處理區塊時為null。hash:DATA,32 Bytes - 區塊的雜湊值。當其為待處理區塊時為null。parentHash:DATA,32 Bytes - 父區塊的雜湊值。nonce:DATA,8 Bytes - 產生的工作量證明 (PoW) 雜湊值。當其為待處理區塊時為null,對於權益證明 (PoS) 區塊(自合併以來)為0x0。sha3Uncles:DATA,32 Bytes - 區塊中叔區塊資料的 SHA3 雜湊值。logsBloom:DATA,256 Bytes - 區塊日誌的布隆過濾器。當其為待處理區塊時為null。transactionsRoot:DATA,32 Bytes - 區塊的交易樹根節點。stateRoot:DATA,32 Bytes - 區塊的最終狀態樹根節點。receiptsRoot:DATA,32 Bytes - 區塊的收據樹根節點。miner:DATA,20 Bytes - 獲得區塊獎勵的受益人地址。difficulty:QUANTITY- 此區塊難度的整數值。totalDifficulty:QUANTITY- 鏈直到此區塊的總難度整數值。extraData:DATA- 此區塊的「額外資料 (extra data)」欄位。size:QUANTITY- 此區塊大小的整數值(以位元組為單位)。gasLimit:QUANTITY- 此區塊允許的最大燃料。gasUsed:QUANTITY- 此區塊中所有交易總消耗的燃料。timestamp:QUANTITY- 區塊打包時的 Unix 時間戳記。transactions:Array- 交易物件的陣列,或 32 Bytes 的交易雜湊值,取決於最後給定的參數。uncles:Array- 叔區塊雜湊值的陣列。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'
// 結果
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"difficulty": "0x4ea3f27bc",
"extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",
"gasLimit": "0x1388",
"gasUsed": "0x0",
"hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",
"mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",
"nonce": "0x689056015818adbe",
"number": "0x1b4",
"parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x220",
"stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",
"timestamp": "0x55ba467c",
"totalDifficulty": "0x78ed983323d",
"transactions": [
],
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": [
]
}
}
eth_getBlockByNumber
根據區塊號碼回傳區塊的相關資訊。
在遊樂場中嘗試端點 (opens in a new tab)參數
QUANTITY|TAG- 區塊號碼的整數,或是字串"earliest"、"latest"、"pending"、"safe"或"finalized",如同區塊參數中所述。Boolean- 若為true,則回傳完整的交易物件;若為false,則僅回傳交易的雜湊值。
params: [
"0x1b4", // 436
true,
]
回傳值 請參閱 eth_getBlockByHash
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'
結果請參閱 eth_getBlockByHash
eth_getTransactionByHash
根據請求的交易雜湊值,回傳關於該交易的資訊。
在遊樂場中嘗試端點 (opens in a new tab)參數
DATA,32 位元組 - 交易的雜湊值
params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]
回傳值
Object - 交易物件,如果找不到交易則回傳 null:
blockHash:DATA,32 位元組 - 包含此交易的區塊雜湊值。如果處於待處理狀態則為null。blockNumber:QUANTITY- 包含此交易的區塊號碼。如果處於待處理狀態則為null。from:DATA,20 位元組 - 發送者的地址。gas:QUANTITY- 發送者提供的燃料。gasPrice:QUANTITY- 發送者提供的 Gas 價格,單位為 Wei。hash:DATA,32 位元組 - 交易的雜湊值。input:DATA- 隨交易發送的資料。nonce:QUANTITY- 發送者在此交易之前進行的交易數量。to:DATA,20 位元組 - 接收者的地址。如果是合約創建交易則為null。transactionIndex:QUANTITY- 交易在區塊中索引位置的整數。如果處於待處理狀態則為null。value:QUANTITY- 轉移的價值,單位為 Wei。v:QUANTITY- ECDSA 恢復 IDr:QUANTITY- ECDSA 簽章 rs:QUANTITY- ECDSA 簽章 s
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'
// 結果
{
"jsonrpc":"2.0",
"id":1,
"result":{
"blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"blockNumber":"0x5daf3b", // 6139707
"from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
"gas":"0xc350", // 50000
"gasPrice":"0x4a817c800", // 20000000000
"hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
"input":"0x68656c6c6f21",
"nonce":"0x15", // 21
"to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
"transactionIndex":"0x41", // 65
"value":"0xf3dbb76162000", // 4290000000000000
"v":"0x25", // 37
"r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"
}
}
eth_getTransactionByBlockHashAndIndex
根據區塊雜湊與交易索引位置,回傳交易的相關資訊。
在遊樂場中測試端點 (opens in a new tab)參數
DATA,32 位元組 - 區塊的雜湊值。QUANTITY- 交易索引位置的整數。
params: [
"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"0x0", // 0
]
回傳值 請參閱 eth_getTransactionByHash
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
結果請參閱 eth_getTransactionByHash
eth_getTransactionByBlockNumberAndIndex
根據區塊號碼與交易索引位置,回傳交易的相關資訊。
在遊樂場中嘗試端點 (opens in a new tab)參數
QUANTITY|TAG- 區塊號碼,或是字串"earliest"、"latest"、"pending"、"safe"或"finalized",如同 區塊參數 中的說明。QUANTITY- 交易索引位置。
params: [
"0x9c47cf", // 10241999
"0x24", // 36
]
回傳 請參閱 eth_getTransactionByHash
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'
結果請參閱 eth_getTransactionByHash
eth_getTransactionReceipt
透過交易雜湊值回傳交易的收據。
注意:待處理的交易無法取得收據。
參數
DATA,32 位元組 - 交易的雜湊值
params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]
回傳值
Object - 交易收據物件,如果找不到收據則回傳 null:
transactionHash:DATA,32 位元組 - 交易的雜湊值。transactionIndex:QUANTITY- 交易在區塊中索引位置的整數。blockHash:DATA,32 位元組 - 包含此交易的區塊雜湊值。blockNumber:QUANTITY- 包含此交易的區塊號碼。from:DATA,20 位元組 - 發送者的地址。to:DATA,20 位元組 - 接收者的地址。如果是合約創建交易,則為 null。cumulativeGasUsed:QUANTITY- 在區塊中執行此交易時所使用的燃料總量。effectiveGasPrice:QUANTITY- 每單位燃料支付的基礎費用與小費總和。gasUsed:QUANTITY- 僅此特定交易所使用的燃料量。contractAddress:DATA,20 位元組 - 如果該交易是合約創建交易,則為創建的合約地址,否則為null。logs:Array- 此交易所產生的日誌物件陣列。logsBloom:DATA,256 位元組 - 供輕客戶端快速擷取相關日誌的布隆過濾器。type:QUANTITY- 交易類型的整數,0x0為傳統交易,0x1為存取清單類型,0x2為動態費用。
它還會回傳_以下其中一項_:
root:DATA32 位元組的交易後狀態根(拜占庭升級前)status:QUANTITY為1(成功)或0(失敗)
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'
// 結果
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"blockHash":
"0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",
"blockNumber": "0xeff35f",
"contractAddress": null, // 如果已建立,則為該地址的字串
"cumulativeGasUsed": "0xa12515",
"effectiveGasPrice": "0x5a9c688d4",
"from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",
"gasUsed": "0xb4c8",
"logs": [{
// 由 getFilterLogs 等回傳的日誌
}],
"logsBloom": "0x00...0", // 256 位元組布隆過濾器
"status": "0x1",
"to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"transactionHash":
"0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",
"transactionIndex": "0x66",
"type": "0x2"
}
}
eth_getUncleByBlockHashAndIndex
根據區塊雜湊值與叔塊索引位置,回傳區塊的叔塊資訊。
在遊樂場測試端點 (opens in a new tab)參數
DATA,32 位元組 - 區塊的雜湊值。QUANTITY- 叔塊的索引位置。
params: [
"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
"0x0", // 0
]
回傳值 請參閱 eth_getBlockByHash
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
結果請參閱 eth_getBlockByHash
注意:叔塊不包含個別交易。
eth_getUncleByBlockNumberAndIndex
根據區塊編號與叔塊索引位置,回傳區塊的叔塊資訊。
在遊樂場中嘗試端點 (opens in a new tab)參數
QUANTITY|TAG- 區塊編號,或是字串"earliest"、"latest"、"pending"、"safe"、"finalized",如同 區塊參數 中的說明。QUANTITY- 叔塊的索引位置。
params: [
"0x29c", // 668
"0x0", // 0
]
回傳值 請參閱 eth_getBlockByHash
注意:叔塊不包含個別交易。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'
結果請參閱 eth_getBlockByHash
eth_newFilter
根據過濾器選項建立一個過濾器物件,以便在狀態改變(日誌)時發出通知。 若要檢查狀態是否已改變,請呼叫 eth_getFilterChanges。
關於指定主題過濾器的注意事項: 主題與順序有關。包含主題為 [A, B] 之日誌的交易將與以下主題過濾器相符:
[]「任何值」[A]「A 在第一個位置(及其後任何值)」[null, B]「任何值在第一個位置,且 B 在第二個位置(及其後任何值)」[A, B]「A 在第一個位置,且 B 在第二個位置(及其後任何值)」[[A, B], [A, B]]「(A 或 B) 在第一個位置,且 (A 或 B) 在第二個位置(及其後任何值)」- 參數
Object- 過濾器選項:
fromBlock:QUANTITY|TAG- (選填,預設值:"latest")整數區塊號碼,或以"latest"代表最後一個提議的區塊,"safe"代表最新的安全區塊,"finalized"代表最新的已定案區塊,或以"pending"、"earliest"代表尚未包含在區塊中的交易。toBlock:QUANTITY|TAG- (選填,預設值:"latest")整數區塊號碼,或以"latest"代表最後一個提議的區塊,"safe"代表最新的安全區塊,"finalized"代表最新的已定案區塊,或以"pending"、"earliest"代表尚未包含在區塊中的交易。address:DATA|Array,20 Bytes - (選填)合約地址或日誌應源自的地址清單。topics:Array of DATA,- (選填)32 Bytes 的DATA主題陣列。主題與順序有關。每個主題也可以是帶有「或 (or)」選項的 DATA 陣列。
params: [
{
fromBlock: "0x1",
toBlock: "0x2",
address: "0x8888f1f195afa192cfee860698584c030f4c9db1",
topics: [
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
null,
[
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc",
],
],
},
]
回傳值
QUANTITY - 過濾器 ID。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_newBlockFilter
在節點中建立一個過濾器,以便在有新區塊到達時發出通知。 若要檢查狀態是否已更改,請呼叫 eth_getFilterChanges。
參數 無
回傳值
QUANTITY - 過濾器 ID。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_newPendingTransactionFilter
在節點中建立一個過濾器,以便在新的待處理交易到達時發出通知。 若要檢查狀態是否已更改,請呼叫 eth_getFilterChanges。
參數 無
回傳值
QUANTITY - 過濾器 ID。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": "0x1" // 1
}
eth_uninstallFilter
卸載具有指定 ID 的過濾器。當不再需要監聽時,應始終呼叫此方法。 此外,如果一段時間內未透過 eth_getFilterChanges 請求過濾器,過濾器將會逾時。
參數
QUANTITY- 過濾器 ID。
params: [
"0xb", // 11
]
回傳值
Boolean - 如果過濾器成功卸載則回傳 true,否則回傳 false。
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
// 結果
{
"id":1,
"jsonrpc": "2.0",
"result": true
}
eth_getFilterChanges
篩選器的輪詢方法,會回傳自上次輪詢以來發生的日誌陣列。
參數
QUANTITY- 篩選器 ID。
params: [
"0x16", // 22
]
回傳值
Array - 日誌物件的陣列,如果自上次輪詢以來沒有任何變更,則為空陣列。
-
對於使用
eth_newBlockFilter建立的篩選器,回傳值為區塊雜湊值(DATA,32 位元組),例如["0x3454645634534..."]。 -
對於使用
eth_newPendingTransactionFilter建立的篩選器,回傳值為交易雜湊值(DATA,32 位元組),例如["0x6345343454645..."]。 -
對於使用
eth_newFilter建立的篩選器,日誌是具有以下參數的物件:removed:TAG- 當日誌因為區塊鏈重組而被移除時為true。如果是有效的日誌則為false。logIndex:QUANTITY- 日誌在區塊中索引位置的整數。當其為待處理的日誌時為null。transactionIndex:QUANTITY- 產生該日誌的交易索引位置的整數。當其為待處理的日誌時為null。transactionHash:DATA,32 位元組 - 產生該日誌的交易雜湊值。當其為待處理的日誌時為null。blockHash:DATA,32 位元組 - 包含該日誌的區塊雜湊值。當其為待處理時為null。當其為待處理的日誌時為null。blockNumber:QUANTITY- 包含該日誌的區塊號碼。當其為待處理時為null。當其為待處理的日誌時為null。address:DATA,20 位元組 - 產生此日誌的來源地址。data:DATA- 可變長度的非索引日誌資料。(在 Solidity 中:零個或多個 32 位元組的非索引日誌參數。)topics:Array of DATA- 包含 0 到 4 個 32 位元組DATA的索引日誌參數陣列。(在 Solidity 中:第一個主題是事件簽章的_雜湊_(例如Deposit(address,bytes32,uint256)),除非您使用anonymous說明符宣告該事件。)
-
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
// 結果
{
"id":1,
"jsonrpc":"2.0",
"result": [{
"logIndex": "0x1", // 1
"blockNumber":"0x1b4", // 436
"blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
"transactionIndex": "0x0", // 0
"address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
"data":"0x0000000000000000000000000000000000000000000000000000000000000000",
"topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]
},{
...
}]
}
eth_getFilterLogs
回傳符合給定 ID 過濾器的所有日誌陣列。
參數
QUANTITY- 過濾器 ID。
params: [
"0x16", // 22
]
回傳值 請參閱 eth_getFilterChanges
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'
結果請參閱 eth_getFilterChanges
eth_getLogs
傳回符合給定過濾器物件的所有日誌陣列。
參數
Object- 過濾器選項:
fromBlock:QUANTITY|TAG- (選填,預設值:"latest") 整數區塊號碼,或使用"latest"表示最後一個提議的區塊,"safe"表示最新的安全區塊,"finalized"表示最新已定案的區塊,或使用"pending"、"earliest"表示尚未包含在區塊中的交易。toBlock:QUANTITY|TAG- (選填,預設值:"latest") 整數區塊號碼,或使用"latest"表示最後一個提議的區塊,"safe"表示最新的安全區塊,"finalized"表示最新已定案的區塊,或使用"pending"、"earliest"表示尚未包含在區塊中的交易。address:DATA|Array,20 位元組 - (選填) 合約地址或日誌來源的地址清單。topics:Array of DATA,- (選填) 包含 32 位元組DATA主題的陣列。主題與順序相關。每個主題也可以是帶有「或 (or)」選項的 DATA 陣列。blockHash:DATA,32 位元組 - (選填,未來) 隨著 EIP-234 的加入,blockHash將成為一個新的過濾器選項,它將傳回的日誌限制在具有 32 位元組雜湊值blockHash的單一區塊中。使用blockHash等同於fromBlock=toBlock= 具有雜湊值blockHash的區塊號碼。如果過濾條件中存在blockHash,則不允許使用fromBlock或toBlock。
params: [
{
topics: [
"0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
],
},
]
回傳值 請參閱 eth_getFilterChanges
範例
// 請求
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'
結果請參閱 eth_getFilterChanges
使用範例
使用 JSON-RPC 部署合約
本節包含如何僅使用 RPC 介面部署合約的示範。還有其他部署合約的途徑可以將這種複雜性抽象化——例如,使用建構在 RPC 介面之上的函式庫,像是 Web3.js (opens in a new tab) 和 Web3.py (opens in a new tab)。這些抽象化通常更容易理解且較不容易出錯,但了解其內部運作原理仍然很有幫助。
以下是一個名為 Multiply7 的簡單智能合約,將使用 JSON-RPC 介面部署到以太坊節點。本教學假設讀者已經在執行 Geth 節點。有關節點與客戶端的更多資訊,請參閱這裡。請參閱個別客戶端文件,了解如何為非 Geth 客戶端啟動 HTTP JSON-RPC。大多數客戶端預設在 localhost:8545 上提供服務。
contract Multiply7 {
event Print(uint);
function multiply(uint input) returns (uint) {
Print(input * 7);
return input * 7;
}
}
首先要做的是確保 HTTP RPC 介面已啟用。這意味著我們在啟動時為 Geth 提供 --http 標籤。在這個範例中,我們在私有開發鏈上使用 Geth 節點。使用這種方法,我們不需要真實網路上的以太幣。
geth --http --dev console 2>>geth.log
這將在 http://localhost:8545 上啟動 HTTP RPC 介面。
我們可以透過使用 curl (opens in a new tab) 擷取 Coinbase 地址(從帳戶陣列中取得第一個地址)和餘額,來驗證介面是否正在執行。請注意,這些範例中的資料在您的本機節點上會有所不同。如果您想嘗試這些指令,請將第二個 curl 請求中的請求參數替換為第一個請求傳回的結果。
curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545
{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]}
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545
{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"}
因為數字是十六進位編碼,所以餘額會以十六進位字串的形式,以 Wei 為單位傳回。如果我們想將餘額轉換為以太幣的數字形式,我們可以使用 Geth 主控台中的 web3。
web3.fromWei("0x1639e49bba16280000", "ether")
// "410"
現在我們的私有開發鏈上有一些以太幣了,我們可以部署合約。第一步是將 Multiply7 合約編譯為可以傳送到 EVM 的位元組碼。要安裝 Solidity 編譯器 solc,請遵循 Solidity 文件 (opens in a new tab)。(您可能需要使用較舊的 solc 版本,以符合我們範例中使用的編譯器版本 (opens in a new tab)。)
下一步是將 Multiply7 合約編譯為可以傳送到 EVM 的位元組碼。
echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin
======= <stdin>:Multiply7 =======
Binary:
6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029
現在我們有了編譯好的程式碼,我們需要決定部署它需要花費多少燃料。RPC 介面有一個 eth_estimateGas 方法可以給我們一個估算值。
curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545
{"jsonrpc":"2.0","id":5,"result":"0x1c31e"}
最後部署合約。
curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545
{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}
交易被節點接受,並傳回一個交易雜湊值。這個雜湊可用於追蹤交易。下一步是決定我們合約部署的地址。每筆執行的交易都會建立一張收據。這張收據包含有關交易的各種資訊,例如交易被包含在哪個區塊中,以及 EVM 使用了多少燃料。如果交易建立了一個合約,它也會包含合約地址。我們可以使用 eth_getTransactionReceipt RPC 方法來擷取收據。
curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545
{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}}
我們的合約建立在 0x4d03d617d700cf81935d7f797f4e2ae719648262 上。傳回 null 結果而不是收據,意味著交易尚未被包含在區塊中。請稍候片刻,檢查您的共識客戶端是否正在執行,然後重試。
與智能合約互動
在這個範例中,我們將使用 eth_sendTransaction 傳送一筆交易到合約的 multiply 方法。
eth_sendTransaction 需要幾個參數,特別是 from、to 和 data。From 是我們帳戶的公開地址,而 to 是合約地址。data 參數包含一個有效負載 (payload),定義了必須呼叫哪個方法以及使用哪些參數。這就是 ABI(應用程式二進位介面) (opens in a new tab) 發揮作用的地方。ABI 是一個 JSON 檔案,定義了如何為 EVM 定義和編碼資料。
有效負載的位元組定義了要呼叫合約中的哪個方法。這是對函式名稱及其參數類型進行 Keccak 雜湊後的前 4 個位元組,並以十六進位編碼。multiply 函式接受一個 uint,它是 uint256 的別名。這讓我們得到:
web3.sha3("multiply(uint256)").substring(0, 10)
// "0xc6888fa1"
下一步是編碼參數。只有一個 uint256,例如,值為 6。ABI 有一個部分指定了如何編碼 uint256 類型。
int<M>: enc(X) 是 X 的大端序二補數編碼,對於負數 X,在較高階(左)側填補 0xff,對於正數 X,則填補零位元組,使得長度為 32 位元組的倍數。
這會編碼為 0000000000000000000000000000000000000000000000000000000000000006。
結合函式選擇器和編碼後的參數,我們的資料將會是 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006。
現在可以將其傳送到節點:
curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545
{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"}
由於傳送了一筆交易,因此傳回了一個交易雜湊值。擷取收據會得到:
{
blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
blockNumber: 268,
contractAddress: null,
cumulativeGasUsed: 22631,
gasUsed: 22631,
logs: [{
address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d",
blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
blockNumber: 268,
data: "0x000000000000000000000000000000000000000000000000000000000000002a",
logIndex: 0,
topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],
transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
transactionIndex: 0
}],
transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
transactionIndex: 0
}
收據包含一個日誌。這個日誌是由 EVM 在執行交易時產生的,並包含在收據中。multiply 函式顯示觸發了 Print 事件,其值為輸入值乘以 7。由於 Print 事件的參數是 uint256,我們可以根據 ABI 規則對其進行解碼,這將讓我們得到預期的十進位數 42。除了資料之外,值得注意的是,主題 (topics) 可用於決定是哪個事件建立了該日誌:
web3.sha3("Print(uint256)")
// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"
這只是對一些最常見任務的簡短介紹,示範了 JSON-RPC 的直接用法。