在網頁上連接錢包前,想與大家介紹一下 Wallet、Provider、RPC 等在 Ethereum 中很常聽到的名詞到底是什麼。
我們很常聽到的「錢包」,例如 Metamask、Trust Wallet、Keplr Wallet 等,可以幫助我們與區塊鏈互動。例如我們可以透過在 Remix 中的 Environment 選取 Injected Provider,此時便會自動跳出你在瀏覽器裝的錢包,並使用錢包中的地址來發送合約或是與合約互動。
但是這個錢包到底是什麼呢?
事實上這些錢包是一個集中管理你的私鑰的「管理器」。但是為什麼我們需要這些錢包幫助我們管理這些私鑰?
這就牽扯到以太鏈運作的核心--交易(Transaction)了。
交易大致上可以分為三種:(EOA = Externally Owned Address,也就是一般人所擁有的地址)
一個 transaction object 大致上會長這樣:
{
from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
gasLimit: "21000",
maxFeePerGas: "300",
maxPriorityFeePerGas: "10",
nonce: "0",
value: "10000000000"
}
而一個交易從發起交易到交易完成的流程大致會長這樣:
那問題又回來了,為什麼我們需要這些錢包幫助我們管理私鑰呢?
首先,在發起交易的過程(第一步),需要透過 private key 來做簽署(Signature),表示這一筆交易確實是由「這個地址」而不是透過其他人發出的。
此外在發起交易之後,EOA 需要連接到一個節點(第二步)才能與鏈上互動,像是下圖。
一般來說會需要透過維持一個全節點(像是 Geth,會同步鏈上的所有資料到用戶端以存放副本)與鏈上直接互動(發起交易)。
但是奇怪的是,Metamask 明明看起來似乎沒有連接到所謂的節點,我們也沒有進行任何與鏈上相關的同步,卻能做到「透過 Metamask 來發起交易」?
事實上,Metamask 背後其實連接著 Infura 這個節點供應商。簡單的來說,Infura 提供了節點的服務,當 Metamask 想要發送一筆交易時,會傳送一筆 JSON-RPC 給予 Infura,並透過 Infura 與區塊鏈連接與互動。
但是剛剛好像又提到了一個非常陌生的名詞:RPC。
RPC 的全名為 Remote Procedure Call。
原本是用在一般的分散式系統上,由於 Client 端無法直接獲得 Server 端的資訊(像是 function、object 的 method 等),而需要透過在 Server 端將它的這些資訊顯示給 Client 端,
這時 Client 便可以使用 RPC 來達到呼叫 Server 端上的函式。詳細可以見下圖。
在區塊鏈網路中,Client 就像是我們開發的 DApp,而 Server 則是節點與節點。因此 Metamask 連結到 Infura 的 provider 後便可以透過傳送 RPC 給予 Infura 上的節點達到傳遞交易的功能。
這樣子可以傳送 RPC 給予節點的裝置,我們則稱之為 provider。這樣的 provider 可以輕量化在 private key 送交易給節點的這個過程,畢竟我們沒有辦法無時無刻都運行著一個全節點,同步區塊鏈上的所有資料。
今天介紹的東西大概在生活(我的)中已經是一件稀鬆平常的事情了,從利用 metamask 將合約部屬在鏈上,或是直接送出一筆 ETH 給其他地址。但是今天終於搞懂 metamask 實際上到底在做什麼了,算是解決了我長久以來的疑惑!
若有文章內有任何錯誤的地方歡迎指點與討論!非常感謝!
歡迎贊助窮困潦倒大學生
0xd8538ea74825080c0c80B9B175f57e91Ff885Cb4