導航:首頁 > 以太坊區 > 以太坊abi解析

以太坊abi解析

發布時間:2023-02-14 10:41:37

A. 用Go來做以太坊開發④智能合約

在這個章節中我們會介紹如何用Go來編譯,部署,寫入和讀取智能合約。

與智能合約交互,我們要先生成相應智能合約的應用二進制介面ABI(application binary interface),並把ABI編譯成我們可以在Go應用中調用的格式。

第一步是安裝 Solidity編譯器 ( solc ).

Solc 在Ubuntu上有snapcraft包。

Solc在macOS上有Homebrew的包。

其他的平台或者從源碼編譯的教程請查閱官方solidity文檔 install guide .

我們還得安裝一個叫 abigen 的工具,來從solidity智能合約生成ABI。

假設您已經在計算機上設置了Go,只需運行以下命令即可安裝 abigen 工具。

我們將創建一個簡單的智能合約來測試。 學習更復雜的智能合約,或者智能合約的開發的內容則超出了本書的范圍。 我強烈建議您查看 truffle framework 來學習開發和測試智能合約。

這里只是一個簡單的合約,就是一個鍵/值存儲,只有一個外部方法來設置任何人的鍵/值對。 我們還在設置值後添加了要發出的事件。

雖然這個智能合約很簡單,但它將適用於這個例子。

現在我們可以從一個solidity文件生成ABI。

它會將其寫入名為「Store_sol_Store.abi」的文件中

現在讓我們用 abigen 將ABI轉換為我們可以導入的Go文件。 這個新文件將包含我們可以用來與Go應用程序中的智能合約進行交互的所有可用方法。

為了從Go部署智能合約,我們還需要將solidity智能合約編譯為EVM位元組碼。 EVM位元組碼將在事務的數據欄位中發送。 在Go文件上生成部署方法需要bin文件。

現在我們編譯Go合約文件,其中包括deploy方法,因為我們包含了bin文件。

在接下來的課程中,我們將學習如何部署智能合約,然後與之交互。

Commands

Store.sol

solc version used for these examples

如果你還沒看之前的章節,請先學習 編譯智能合約的章節 因為這節內容,需要先了解如何將智能合約編譯為Go文件。

假設你已經導入從 abigen 生成的新創建的Go包文件,並設置ethclient,載入您的私鑰,下一步是創建一個有配置密匙的交易發送器(tansactor)。 首先從go-ethereum導入 accounts/abi/bind 包,然後調用傳入私鑰的 NewKeyedTransactor 。 然後設置通常的屬性,如nonce,燃氣價格,燃氣上線限制和ETH值。

如果你還記得上個章節的內容, 我們創建了一個非常簡單的「Store」合約,用於設置和存儲鍵/值對。 生成的Go合約文件提供了部署方法。 部署方法名稱始終以單詞 Deploy 開頭,後跟合約名稱,在本例中為 Store 。

deploy函數接受有密匙的事務處理器,ethclient,以及智能合約構造函數可能接受的任何輸入參數。我們測試的智能合約接受一個版本號的字元串參數。 此函數將返回新部署的合約地址,事務對象,我們可以交互的合約實例,還有錯誤(如果有)。

就這么簡單:)你可以用事務哈希來在Etherscan上查詢合約的部署狀態: https://rinkeby.etherscan.io/tx/

Commands

Store.sol

contract_deploy.go

solc version used for these examples

這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。

一旦使用 abigen 工具將智能合約的ABI編譯為Go包,下一步就是調用「New」方法,其格式為「New<contractname style="box-sizing: border-box; font-size: 16px; -ms-text-size-adjust: auto; -webkit-tap-highlight-color: transparent;">」,所以在我們的例子中如果你 回想一下它將是 NewStore 。 此初始化方法接收智能合約的地址,並返回可以開始與之交互的合約實例。</contractname>

Commands

Store.sol

contract_load.go

solc version used for these examples

這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。

在上個章節我們學習了如何在Go應用程序中初始化合約實例。 現在我們將使用新合約實例提供的方法來閱讀智能合約。 如果你還記得我們在部署過程中設置的合約中有一個名為 version 的全局變數。 因為它是公開的,這意味著它們將成為我們自動創建的getter函數。 常量和view函數也接受 bind.CallOpts 作為第一個參數。了解可用的具體選項要看相應類的 文檔 一般情況下我們可以用 nil 。

Commands

Store.sol

contract_read.go

solc version used for these examples

這寫章節需要了解如何將智能合約的ABI編譯成Go的合約文件。如果你還沒看, 前先讀 上一個章節 。

寫入智能合約需要我們用私鑰來對交易事務進行簽名。

我們還需要先查到nonce和燃氣價格。

接下來,我們創建一個新的keyed transactor,它接收私鑰。

然後我們需要設置keyed transactor的標准交易選項。

現在我們載入一個智能合約的實例。如果你還記得 上個章節 我們創建一個名為 Store 的合約,並使用 abigen 工具生成一個Go文件。 要初始化它,我們只需調用合約包的 New 方法,並提供智能合約地址和ethclient,它返回我們可以使用的合約實例。

我們創建的智能合約有一個名為 SetItem 的外部方法,它接受solidity「bytes32」格式的兩個參數(key,value)。 這意味著Go合約包要求我們傳遞一個長度為32個位元組的位元組數組。 調用 SetItem 方法需要我們傳遞我們之前創建的 auth 對象(keyed transactor)。 在幕後,此方法將使用它的參數對此函數調用進行編碼,將其設置為事務的 data 屬性,並使用私鑰對其進行簽名。 結果將是一個已簽名的事務對象。

現在我就可以看到交易已經成功被發送到了以太坊網路了: https://rinkeby.etherscan.io/tx/

要驗證鍵/值是否已設置,我們可以讀取智能合約中的值。

搞定!

Commands

Store.sol

contract_write.go

solc version used for these examples

有時您需要讀取已部署的智能合約的位元組碼。 由於所有智能合約位元組碼都存在於區塊鏈中,因此我們可以輕松獲取它。

首先設置客戶端和要讀取的位元組碼的智能合約地址。

現在你需要調用客戶端的 codeAt 方法。 codeAt 方法接受智能合約地址和可選的塊編號,並以位元組格式返回位元組碼。

你也可以在etherscan上查詢16進制格式的位元組碼 https://rinkeby.etherscan.io/address/#code

contract_bytecode.go

首先創建一個ERC20智能合約interface。 這只是與您可以調用的函數的函數定義的契約。

然後將interface智能合約編譯為JSON ABI,並使用 abigen 從ABI創建Go包。

假設我們已經像往常一樣設置了以太坊客戶端,我們現在可以將新的 token 包導入我們的應用程序並實例化它。這個例子里我們用 Golem 代幣的地址.

我們現在可以調用任何ERC20的方法。 例如,我們可以查詢用戶的代幣余額。

我們還可以讀ERC20智能合約的公共變數。

我們可以做一些簡單的數學運算將余額轉換為可讀的十進制格式。

同樣的信息也可以在etherscan上查詢: https://etherscan.io/token/?a=

Commands

erc20.sol

contract_read_erc20.go

solc version used for these examples

B. 以太坊的ABI編碼

ABI全稱Application Binary Interface, 是調用智能合約函數以及合約之間函數調用的消息編碼格式定義,也可以理解為智能合約函數調用的介面說明. 類似Webservice里的SOAP協議一樣;也就是定義操作函數簽名,參數編碼,返回結果編碼等。

使用ABI協議時必須要求在編譯時知道類型,即強類型相關.

當一個智能合約編譯出來後, 他的abi介面定義就確定了. 比如下面的智能合約:

生成的位元組碼:

生成的abi定義:

可以看出, 生成abi包含了2個定義: 函數 lotus , 事件 Log_lotus , 各個欄位含義見上. 根據該abi定義,就可以生成調用該智能合約函數的abi格式的數據了.

格式簡單的可以表示為: 函數選擇器+參數編碼

一個函數調用的前四個位元組數據指定了要調用的函數簽名。計算方式是使用函數簽名的 keccak256 的哈希,取4個位元組。

函數名如果有多個參數使用,隔開,要去掉表達式中的所有空格。在geth客戶端,通過命令可以得到hash:

由於前面的函數簽名使用了四個位元組,參數的數據將從第五個位元組開始。

根據參數類型,編碼規則有所區別:

除了bytes,和string, 其他類型的數據不足32位元組長度的需要加0補足32位元組. 動態長度的編碼在例子中介紹.

函數: function baz(uint32 x, bool y) :

調用: baz(69, true)

生成的數據如下:

返回結果是一個bool值,在這里,返回的是false:

函數: f(uint,uint32[],bytes10,bytes)

調用: (0x123, [0x456, 0x789], "1234567890", "Hello, world!")

函數選擇器: bytes4(sha3("f(uint256,uint32[],bytes10,bytes)"))

對於 固定大小的類型 值 uint256 和 bytes10 ,直接編碼值。

對於 動態內容類型 值 uint32[] 和 bytes ,我們先 編碼偏移值 ,偏移值是整個值編碼的開始到真正存這個數據的偏移值(這里不計算頭四個用於表示函數簽名的位元組)。

所以參數編碼數據依次為:

尾部部分的第一個動態參數, [0x456, 0x789] 編碼拆解如下:

最後我們來看看第二個動態參數的的編碼, Hello, world! 。

所以最終結果是:

C. 區塊鏈和智能合約,以太坊開發,183位開發者整理,知識體系匯總

在以太坊上開發應用程序的可用工具、組件、模式和平台的指南。

此列表的創建是由 ConsenSys 的產品經理推動的,他們認為需要在新的和有經驗的區塊鏈開發人員之間更好地共享工具、開發模式和組件。

開發智能合約

智能合約語言

構架

IDE

其他工具

測試區塊鏈網路

測試以太水龍頭

前端以太坊 API


後端以太坊 API

引導程序/開箱即用工具

以太坊 ABI(應用程序二進制介面)工具

以太坊客戶端

貯存

Mahuta - 具有附加搜索功能的 IPFS 存儲服務,以前稱為 IPFS-Store

OrbitDB - IPFS 之上的去中心化資料庫

JS IPFS API - IPFS HTTP API 的客戶端庫,用 JavaScript 實現

TEMPORAL - 易於使用的 API 到 IPFS 和其他分布式/去中心化存儲協議

PINATA - 使用 IPFS 的最簡單方法

消息傳遞

測試工具

安全工具

監控

其他雜項工具

Cheshire - CryptoKitties API 和智能合約的本地沙箱實現,可作為 Truffle Box 使用

ERCs-以太坊評論請求存儲庫

ERC-20 - 可替代資產的原始令牌合約

ERC-721 - 不可替代資產的令牌標准

ERC-777 - 可替代資產的改進令牌標准

ERC-918 - 可開采令牌標准

流行的智能合約庫

可擴展性

支付/狀態通道

等離子體

側鏈

POA橋

POA 橋用戶界面

POA 橋梁合同

ZK-SNARK

ZK-STARK

預構建的 UI 組件

以上內容,來自git庫:

github.com/ConsenSys/ethereum-developer-tools-list

我是魚歌,一個在深圳創業的全棧程序員,主攻區塊鏈,元宇宙和智能合約,附加小程序和app開發。

[祈禱]

D. iOS應用程序如何調用以太坊智能合約

以太坊智能合約有各種各樣的用例,但到目前為止,從你的iOS應用程序中調用它們非常困難。不過如果使用 以太坊iOS開發套件 和 EtherKit ,這種情況會改善很多,你可以立即開始使用。在本教程結束時,你將能夠調用其ABI(應用程序二進制介面)中定義的任何公共合約函數。

對於這個項目,我們將使用Xcode 10.0和ContractCodegen 0.1。我們還建議使用iOS MVVM項目模板,但為了使本教程簡單,我們將使用正常的iOS項目結構。

E. *(a+b[i])+=1什麼意思

意思就是ABI1是以太坊的一種合約間調用時的一個消息格式。類似Webservice里的SOAP協議一樣;也就是定義操作函數簽名,參數編碼,返回結果編碼等。

F. 智能合約abi弄不出來怎麼辦

一般來說,部署智能合約的步驟為:
1啟動一個以太坊節點 (例如geth或者testrpc)。
2使用solc編譯智能合約。 => 獲得二進制代碼。
3將編譯好的合約部署到網路。(這一步會消耗以太幣,還需要使用你的節點的默認地址或者指定地址來給合約簽名。) => 獲得合約的區塊鏈地址和ABI(合約介面的JSON表示,包括變數,事件和可以調用的方法)。(譯註:作者在這里把ABI與合約介面弄混了。ABI是合約介面的二進製表示。)
4用web3.js提供的JavaScript API來調用合約。(根據調用的類型有可能會消耗以太幣。)

G. 使用Web3J與第三方合約交互——批量轉賬

之前使用NodeJs與智能合約交互,都是訪問的自己部署的合約。最近要對線上第三方合約進行轉賬操作,人數比較多,一筆筆操作起來手指都點斷了還容易出錯。既然代幣Token都遵守ERC20協議,肯定有統一的Transfer(轉賬)方法供客戶端調用,那麼編寫程序實現自動轉賬應該可以實現,去查了相關資料發現web3j是不錯的選擇。

輕量級客戶端與以太坊交互的Java庫。

既然是調用第三方合約那麼肯定需要知道合約地址,合約地址定義了到哪裡去訪問合約;
ABI(Application Binary Interface): 應用程序二進制介面,定義了智能合約提供的方法功能

若是無法獲取到ABI介面,也可以使用solc編譯生產bin和abi文件。

(生產代理類時可以指定包路徑和類名)

這樣一來,便可以使用程序完成批量轉賬操作。

後來研究發現,使用NodeJs直接調用Web3也可以實現對應功能,不過還是對Java更熟悉一些,就採用了Java的方式。

H. 一學就會,手把手教你用Go語言調用智能合約

智能合約調用是實現一個 DApp 的關鍵,一個完整的 DApp 包括前端、後端、智能合約及區塊 鏈系統,智能合約的調用是連接區塊鏈與前後端的關鍵。

我們先來了解一下智能合約調用的基礎原理。智能合約運行在以太坊節點的 EVM 中。因此要 想調用合約必須要訪問某個節點。

以後端程序為例,後端服務若想連接節點有兩種可能,一種是雙 方在同一主機,此時後端連接節點可以採用 本地 IPC(Inter-Process Communication,進 程間通信)機制,也可以採用 RPC(Remote Procere Call,遠程過程調用)機制;另 一種情況是雙方不在同一台主機,此時只能採用 RPC 機制進行通信。

提到 RPC, 讀者應該對 Geth 啟動參數有點印象,Geth 啟動時可以選擇開啟 RPC 服務,對應的 默認服務埠是 8545。。

接著,我們來了解一下智能合約運行的過程。

智能合約的運行過程是後端服務連接某節點,將 智能合約的調用(交易)發送給節點,節點在驗證了交易的合法性後進行全網廣播,被礦工打包到 區塊中代表此交易得到確認,至此交易才算完成。

就像資料庫一樣,每個區塊鏈平台都會提供主流 開發語言的 SDK(Software Development Kit,軟體開發工具包),由於 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節點、發交易,直接在工程內導入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。

總結一下,智能合約被調用的兩個關鍵點是節點和 SDK。

由於 IPC 要求後端與節點必須在同一主機,所以很多時候開發者都會採用 RPC 模式。除了 RPC,以太坊也為開發者提供了 json- rpc 介面,本文就不展開討論了。

接下來介紹如何使用 Go 語言,藉助 go-ethereum 源碼庫來實現智能合約的調用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。

步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應用二進制介面)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創建該文件,文件名可自定義,後綴最好使用 abi)。

最好能將 calldemo.abi 單獨保存在一個目錄下,輸入「ls」命令只能看到 calldemo.abi 文件,參 考效果如下:

步驟 02:獲得合約地址。注意要將合約部署到 Geth 節點。因此 Environment 選擇為 Web3 Provider。

在【Environment】選項框中選擇「Web3 Provider」,然後單擊【Deploy】按鈕。

部署後,獲得合約地址為:。

步驟 03:利用 abigen 工具(Geth 工具包內的可執行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉換為 Go 代碼,命令如下:

其中各參數的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結構類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執行後,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。

步驟 04:創建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數內要傳入該合約部署後的地址,此地址在步驟 01 中獲得。

步驟 04:設置 go mod,以便工程自動識別。

前面有所提及,若要使用 Go 語言調用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:

該指令會自動將 go-ethereum 下載到「$GOPATH/src/github.com/ethereum/go-ethereum」,這樣還算 不錯。不過,Go 語言自 1.11 版本後,增加了 mole 管理工程的模式。只要設置好了 go mod,下載 依賴工程的事情就不必關心了。

接下來設置 mole 生效和 GOPROXY,命令如下:

在項目工程內,執行初始化,calldemo 可以自定義名稱。

步驟 05:運行代碼。執行代碼,將看到下面的效果,以及最終輸出的 2020。

上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運行結果是正確的了。

I. 用Go來做以太坊開發⑤事件日誌

智能合約具有在執行期間「發出」事件的能力。 事件在以太坊中也稱為「日誌」。 事件的輸出存儲在日誌部分下的事務處理中。 事件已經在以太坊智能合約中被廣泛使用,以便在發生相對重要的動作時記錄,特別是在代幣合約(即ERC-20)中,以指示代幣轉賬已經發生。 這些部分將引導您完成從區塊鏈中讀取事件以及訂閱事件的過程,以便交易事務被礦工打包入塊的時候及時收到通知。

為了訂閱事件日誌,我們需要做的第一件事就是撥打啟用websocket的以太坊客戶端。 幸運的是,Infura支持websockets。

下一步是創建篩選查詢。 在這個例子中,我們將閱讀來自我們在之前課程中創建的示例合約中的所有事件。

我們接收事件的方式是通過Go channel。 讓我們從go-ethereum core/types 包創建一個類型為 Log 的channel。

現在我們所要做的就是通過從客戶端調用 SubscribeFilterLogs 來訂閱,它接收查詢選項和輸出通道。 這將返回包含unsubscribe和error方法的訂閱結構。

最後,我們要做的就是使用select語句設置一個連續循環來讀入新的日誌事件或訂閱錯誤。

我們會在下個章節介紹如何解析日誌。

Commands

Store.sol

event_subscribe.go

智能合約可以可選地釋放「事件」,其作為交易收據的一部分存儲日誌。讀取這些事件相當簡單。首先我們需要構造一個過濾查詢。我們從go-ethereum包中導入 FilterQuery 結構體並用過濾選項初始化它。我們告訴它我們想過濾的區塊范圍並指定從中讀取此日誌的合約地址。在示例中,我們將從在 智能合約章節 創建的智能合約中讀取特定區塊所有日誌。

下一步是調用ethclient的 FilterLogs ,它接收我們的查詢並將返回所有的匹配事件日誌。

返回的所有日誌將是ABI編碼,因此它們本身不會非常易讀。為了解碼日誌,我們需要導入我們智能合約的ABI。為此,我們導入編譯好的智能合約Go包,它將包含名稱格式為 <Contract>ABI 的外部屬性。之後,我們使用go-ethereum中的 accounts/abi 包的 abi.JSON 函數返回一個我們可以在Go應用程序中使用的解析過的ABI介面。

現在我們可以通過日誌進行迭代並將它們解碼為我么可以使用的類型。若您回憶起我們的樣例合約釋放的日誌在Solidity中是類型為 bytes32 ,那麼Go中的等價物將是 [32]byte 。我們可以使用這些類型創建一個匿名結構體,並將指針作為第一個參數傳遞給解析後的ABI介面的 Unpack 函數,以解碼原始的日誌數據。第二個參數是我們嘗試解碼的事件名稱,最後一個參數是編碼的日誌數據。

此外,日誌結構體包含附加信息,例如,區塊摘要,區塊號和交易摘要。

若您的solidity事件包含 indexed 事件類型,那麼它們將成為 主題 而不是日誌的數據屬性的一部分。在solidity中您最多隻能有4個主題,但只有3個可索引的事件類型。第一個主題總是事件的簽名。我們的示例合約不包含可索引的事件,但如果它確實包含,這是如何讀取事件主題。

正如您所見,首個主題只是被哈希過的事件簽名。

這就是閱讀和解析日誌的全部內容。要學習如何訂閱日誌,閱讀上個章節。

命令

Store.sol

event_read.go

首先,創建ERC-20智能合約的事件日誌的interface文件 erc20.sol :

然後在給定abi使用 abigen 創建Go包

現在在我們的Go應用程序中,讓我們創建與ERC-20事件日誌簽名類型相匹配的結構類型:

初始化以太坊客戶端

按照ERC-20智能合約地址和所需的塊范圍創建一個「FilterQuery」。這個例子我們會用 ZRX 代幣:

用 FilterLogs 來過濾日誌:

接下來我們將解析JSON abi,稍後我們將使用解壓縮原始日誌數據:

為了按某種日誌類型進行過濾,我們需要弄清楚每個事件日誌函數簽名的keccak256哈希值。 事件日誌函數簽名哈希始終是 topic [0] ,我們很快就會看到。 以下是使用go-ethereum crypto 包計算keccak256哈希的方法:

現在我們將遍歷所有日誌並設置switch語句以按事件日誌類型進行過濾:

現在要解析 Transfer 事件日誌,我們將使用 abi.Unpack 將原始日誌數據解析為我們的日誌類型結構。 解包不會解析 indexed 事件類型,因為它們存儲在 topics 下,所以對於那些我們必須單獨解析,如下例所示:

Approval 日誌也是類似的方法:

最後,把所有的步驟放一起:

我們可以把解析的日誌與etherscan的數據對比: https://etherscan.io/tx/#eventlog

Commands

erc20.sol

event_read_erc20.go

solc version used for these examples

要讀取 0x Protocol 事件日誌,我們必須首先將solidity智能合約編譯為一個Go包。

安裝solc版本 0.4.11

為例如 Exchange.sol 的事件日誌創建0x Protocol交易所智能合約介面:

Create the 0x protocol exchange smart contract interface for event logs as Exchange.sol :

接著給定abi,使用 abigen 來創建Go exchange 包:

Then use abigen to create the Go exchange package given the abi:

現在在我們的Go應用程序中,讓我們創建與0xProtocol事件日誌簽名類型匹配的結構體類型:

初始化以太坊客戶端:

創建一個 FilterQuery ,並為其傳遞0x Protocol智能合約地址和所需的區塊范圍:

用 FilterLogs 查詢日誌:

接下來我們將解析JSON abi,我們後續將使用解壓縮原始日誌數據:

為了按某種日誌類型過濾,我們需要知曉每個事件日誌函數簽名的keccak256摘要。正如我們很快所見到的那樣,事件日誌函數簽名摘要總是 topic[0] :

現在我們迭代所有的日誌並設置一個switch語句來按事件日誌類型過濾:

現在要解析 LogFill ,我們將使用 abi.Unpack 將原始數據類型解析為我們自定義的日誌類型結構體。Unpack不會解析 indexed 事件類型,因為這些它們存儲在 topics 下,所以對於那些我們必須單獨解析,如下例所示:

對於 LogCancel 類似:

最後是 LogError :

將它們放在一起並運行我們將看到以下輸出:

將解析後的日誌輸出與etherscan上的內容進行比較: https://etherscan.io/tx/

命令

Exchange.sol

event_read_0xprotocol.go

這些示例使用的solc版本

J. DApp開發入門

本文僅介紹以太坊系列的DApp開發,其他鏈原理差不太多。

MetaMask安裝完成並運行後,可以在Chrome控制台列印 MetaMask注入的window.ethereum對象

關於ethereum對象,我們只需要關心 ethereum.request 就足夠了,MetaMask 使用 ethereum.request(args) 方法 來包裝 RPC API。這些 API 基於所有以太坊客戶端公開的介面。 簡單來說錢包交互的大部分操作都是由 request() 方法實現,通過傳入不同的方法名來區分。

⚠️ 即使ethereum對象中提供了chainId,isMetaMask,selectAddress屬性,我們也不能完全相信這些屬性,他們是不穩定或不標准,不建議使用。我們可以通過上面說的request方法,拿到可靠的數據

錢包通過method方法名,進行對應的實現 以獲取錢包地址為例

調用 ethereum.request({ method: "eth_requestAccounts" }) ,錢包實現了該方法,那麼就可以拿到錢包的地址了。

MetaMask注入的 window.ethereum 就是一個Provider,一個RPC節點也是一個Provider,通過Provider,我們有了訪問區塊鏈的能力。 在連接到錢包的情況下,通常使用錢包的Provider就可以了, ethers.providers.Web3Provider(ethereum)

如果只需要查詢一些區塊鏈數據,可以使用EtherscanProvider 和 InfuraProvider 連接公開的 第三方節點服務提供商 。JsonRpcProvider 和 IpcProvider 允許連接到我們控制或可以訪問的以太坊節點。

獲取當前賬戶余額

獲取最新區塊號

其他RPC操作,可以通過 JSON-RPC 查看。

通過 ethers.js 可以連接ERC20的合約,合約編譯後會生成ABI,合約部署後,會生成合約地址,開發者通過 ABI和合約地址 ,對合約發送消息。

合約中的方法大致分為兩種: 視圖方法(免費),非視圖方法(消耗Gas) ,可以通過ABI查看方法類型。

⚠️ ERC20需要多加關注的是 Approve() 方法以及 transfer() 和 transferFrom() 的區別 ,授權過的代幣,被授權的那一方,可以通過調用 transferFrom() 方法,轉走你授權數量內的代幣,所以授權是一個很危險的操作,假設你授權了一個不良的合約,那你會面臨授權的token被轉走的風險,即使你沒有泄露私鑰助記詞。

便利三方庫: web3-react use-wallet

文檔: doc.metamask.io ethers

閱讀全文

與以太坊abi解析相關的資料

熱點內容
比特幣走勢圖日k線從哪裡看 瀏覽:528
辛巴威可以交易比特幣 瀏覽:691
比特幣對貨幣流通 瀏覽:972
比特幣每天的開盤價和收盤價 瀏覽:721
算力和 瀏覽:931
下載比特幣的行情走勢 瀏覽:659
關於數字貨幣流動的背景 瀏覽:233
trx虛擬貨幣預計會漲到多少 瀏覽:266
囤萊特幣還是以太坊 瀏覽:968
以太坊啥時候開始的 瀏覽:362
比特幣從一萬漲到一萬五 瀏覽:810
做虛擬貨幣的人都瘋狂了 瀏覽:992
比特幣最貴價格多少錢一個 瀏覽:330
深圳數字貨幣在哪裡申請 瀏覽:162
比特幣最早在中國的體現 瀏覽:410
比特幣美國情報局 瀏覽:475
怎樣注銷數字貨幣賬戶 瀏覽:415
被騙充值花椒虛擬貨幣 瀏覽:681
虛擬貨幣拉人套路 瀏覽:648
比特幣礦機靜音 瀏覽:323