KryptoCamp — Day30~31 — 區塊鏈的後端 geth、合約優化
一般來說簡單的區塊鏈項目是不需要後端的,但是如果是要開發比較底層的技術比如說新的鏈就會需要了,目前唯一的主流就是 geth ,all in one solidity 在最後也花了一些篇幅介紹這個工具,今天就花點時間了解一下。
什麼是 geth?
Go-Ethereum,簡稱 Geth,為一個 Ethereum Protocal 同時也是一個 command line 工具。
geth 在做什麼?
- Geth會以區塊鏈節點的方式運行。
- Geth會找到其他區塊鏈節點並與其連接。
- Geth會在本地端打開一JavaScript RPC,讓我們可以以此和節點互動。
- 開始連接節點,下載(複製)區塊鏈上的資料。
- 區塊鏈(資料)會存在我們的本地端,並不存在任何的中央伺服器或者資料庫。
簡單來說,運行它後會在本地開啟一個區塊鏈的節點,而這個節點可以跟其他的區塊鏈節點溝通,可以想像你的本地成為了區塊鏈巨大帳本的其中一本的那種感覺。
geth 在同步資料時預設只同步1024筆交易。包含所有區塊的Block Header + Block Bodies。
關於合約的最佳化
所謂的最佳化是指,達到一樣的功能但是花費最少的 gas。值得注意的是,在礦工的邏輯上,他會優先執行 gas fee 較高的交易,也就是說如果交易付的手續費比較低,礦工就會偏好晚一點打包我們合約的交易。
決定 gas fee 一個很大的關鍵是在運算的複雜度上,但是同樣的複雜度也同樣有可能有價格的差別,這是因為在不同的時間點每一個單位的 gas 價格是不同的。
在交易前查看一下當前 gas 是個好習慣。
能在鏈外完成的計算就在鏈外完成,不需要重複利用的 log 可以用 event 發出,gas fee 的節約可以從幾個地方著手:
Time Complexity Level
能不遍歷就不遍歷,尋找提早結束運算的可能性。進行各種運算時先把值賦給 local variable ,避免多次改寫 stat variable 浪費 gas。當需要使用 ||
或 &&
時,想一下是否有提早結束運算的機會。
Contract Level
撰寫智能合約時我們常常引入 open zeppelin 的合約,但是如果當中有不需要的功能就會白白浪費 gas,拔除自己不需要的變數,或是將可模組化的部分寫入 library 減少需要重複部署的部分。