開發者必須了解的以太坊 Data Flow

交易如何加密?節點所處理的資料又是什麼?

Greg Shen
8 min readJun 19, 2022

要做一個以太坊 Dapp,在學習智能合約開發後,就是跟前端連結,我在這個階段撞了一段時間。今天來分享一下以太坊的資訊流,希望對大家有幫助,有不清楚的地方歡迎隨時提問。

大綱

  • 以太坊Dapp講解
  • 非對稱加密簡介
  • Provider是什麼
  • 解釋透過節點服務商(這裡以 Alchemy當範例)送出交易時,私鑰會在哪裡使用
所謂Dapp架構

Ethereum Dapp分成後端與前端,後端程式就是 Smart Contract,前端程式就是 Dapp。Smart Contract 可使用 Solidity 撰寫,目前也有許多其他語言可以撰寫 Smart Contract。Smart Contract 要在 Ethereum 上的 EVM 執行要先 Compile 成 Byte Code 之後,再透過 IPC 或 RPC 發佈到 Ethereum 上。前端程式的 Dapp 可用 web3.js or ethers.js 透過 JSON-RPC 接上 Ethereum,以及使用網頁應用常用到的 HTML、CSS、JavaScript 製作成UI,就能執行部署在 Ethereum 上 Smart Contract 所提供的一些程式功能了。

介紹完 data flow,接下來解釋我們的 transaction 到底是如何傳送、加密、解密、上鏈。

首先要複習個對稱式加密與非對稱式加密。

對稱加密(Symmetric Encryption)

對稱式加密流程

如上圖,Alice 想傳給 Bob 一個訊息 m
1. 先將 m 用 e 加密成為 c,例如 +e, -e 或是 e次方等等
2. Bob 拿到 c 之後再用 e 反向操作,還原出 m
這種很容易被破解,因為 c 在傳送的過程中如果被駭客在攔截到,駭客可以嘗試用固定規則去還原;如果 Alice 每傳一次訊息,都要換一次 e,那也要想辦法把 e 傳給 Bob,既麻煩又有被攔截的風險。

非對稱式加密(Asymmetric Encryption)

對稱式加密流程

仔細比較兩張圖就可以發現,差別在於解密一個是 ‘-e’,另一個則是’-d’,還記得對稱式加密為什麼容易被破解嗎?因為解密只是反向還原,若是每次都改變 e 並以不同手法傳送,駭客也可能同時攔截到 c 與 e。

非對稱式加密的原理就是利用一組鑰匙加密,既然是一組,那其中必定有所關聯,也就是 e 與 d 是有某種關聯性,而且光有一個鑰匙是沒辦法推導出另外一個鑰匙的。

今天 Alice 又想傳訊息給 Bob 了:
1. 先將 m 用 e(私鑰) 加密成為 c
2. Bob 拿到 c 之後再用 d(公鑰) 解密,還原出 m

今天就算駭客攔截到 c, e了,沒有 d 依然還原不了 m

如同上述概念,在區塊鏈中,我們送出的訊息以私鑰加密,到節點後節點會用你的公鑰(你的地址)解密得出所要送出的 transaction資料,再幫你上鏈。

在我們深入了解 transaction 包含什麼之前,要先了解 Provider 是什麼

Provider是什麼

用來連結以太坊網路的 abstraction。

從web3.js來的開發者可能不習慣的概念就是Provider

實作部分

一、先部署智能合約

圖一

範例程式碼我以 mintNFT function為例,智能合約我已經先部署好了,因為是data flow介紹,重點不會是function的多樣性,而是資料怎麼傳遞,所以只放了一個 function叫做 mintNFT,如圖一。

記住,這是 Solidity,是針對以太坊的,稍後的程式碼都會是 Javascript。

二、跟節點溝通

方式一:JS Library: web3.js, ethers.js

完整的 JavaScript library,專門用來與以太坊和相關生態系溝通。

圖二

實作一個 mintNFT function,直接送出 request等節點 pick up你的交易,如圖二,以下介紹圖二中的 provider, signer, contract分別代表什麼。

圖三

補充說明,這個 mintNFT 會是放在前端的button,onClick後所執行的動作,如圖三所示。

  • Provider: Provider 是一個類別,抽象地說他可以被用來連結以太坊網路,並且提供一個唯讀的條件來查看區塊鏈及其狀態。
  • Signer: Signer 是一個類別,通常會使用一些方法直接地或間接地存取私鑰,可以被用於簽核資訊及交易,並授權給網絡來呈現不同需求。w
  • Contract: 此處的 Contract 代表與以太坊網路上特定合約的連結,因此這些應用可以像是普通 JavaScript 物件一樣被普遍的使用。

方式二:alchemy api, infura api, moralis api(webSocket)、Geth, Parity(full node)

以上都是節點服務商,可以選擇要使用別人的節點還是自建節點。

在這邊範例我使用 Alchemy,Alchemy的好處請看下圖,其實在開發產品的時候用節點服務會比第一種方式快速非常多,等待節點確認時間很短,上production後就更需要這種服務了。

Alchemy Advantages
圖a

(1) 首先,把環境變數設置好,public key, private key, api key這類的東西我們通常會放在.env檔,避免被看到,剩下的就是代入contract abi, address(我有事先部署好了),還有實例化contract,便能使用這個contract中的function,如圖a所示。

圖b

(2) 再來就是mint function,如圖b。

有些人可能會有疑問,私鑰會不會被Alchemy拿到,產生被盜的問題。

答案是不會。

因為如果會發生這種事,早就被爆出來了。開玩笑的,不偷懶,我們來看真正的原因。

第23行的signPromise回傳的是web3.eth.accounts.signTransaction,而signTransaction長相如下。

signTransaction所需參數以及它的結構

可以看出它會return signedTransaction,結構如下圖。

SignedTransaction的結構

看看 console.log(await signPromise)

第26行中的web3.eth.sendSignedTransaction才是真正送資料去節點的 function,如下圖,它所帶的參數為27行的 rawTransaction以及28行的function,28行這個function是可帶可不戴的的,它只是一個 callback,會回傳執行結果或是錯誤訊息 。

那麼rawTransaction是什麼?

rawTransaction組成由

{nonce, gasPrice, gasLimit, to, value, data, signature};

其中data已經是encoded function,但拆分後會發現裡面額外穿插一些值,其實因為以太坊在做serialize的時候,選用RLP encoding,RLP蠻好理解的,有興趣的人點擊下面連結看詳細介紹。

https://eth.wiki/en/fundamentals/rlp

最後的signature就是直接放 vrs。

總之,我們會先將交易內容跟私鑰加密並傳給節點,節點會透過我們的錢包地址(公鑰)解密,再上傳資料到鏈上,正如一開始所提到的非對稱式加密的運作原理。看到這裡,大家應該可以安心使用 Alchemy了吧。

希望這篇有幫助各位開發者更了解以太坊 data flow!

追蹤以獲得更新通知,歡迎隨時聯繫我

Email: gregshen0925@gmail

Telegram: @gregshen0925

歡迎追蹤 :)

--

--