web3從入門到實戰-理論篇

MangoGoing發表於2023-03-05

中心化網路已經幫助數十億人融入了網際網路,並在其上建立了穩定、可靠的基礎設施。 與此同時,少數中心化巨頭幾乎壟斷了網際網路,甚至可以為所欲為。Web3 是擺脫這一困境的方案。 不同於科技巨頭壟斷的傳統網際網路,Web3 採用去中心化,由所有使用者構建、運營和擁有。 Web3 將權力賦予個人而非公司...

——來自etherum官網文件

前言

按學習路線不定期分享我自身入行區塊鏈領域學習心得和筆記,歡迎糾正和交流~

學習路線

區塊鏈理論部分:北京大學肖臻老師《區塊鏈技術與應用》公開課

以太坊瀏覽器:etherscan

合約實戰:openzeppelin

etherscan增強外掛:MetaDock

交易瀏覽器:Phalcon

DApp開源專案:Uniswap

NFT市場:Opensea

發展歷程

用一張圖大致回顧一下 web 發展的3個主要時代:

  • web1時代(1990 年至 2004 ):網際網路站點以入口網站為主,大多用來獲取資訊,那時候的網站資訊以文字為主。
  • web2時代(2004 年 - 至今):axios的出現讓網站有了及時互動性,大多數網站都是用js框架開發而不單純的是為了獲取資訊,前端工程師崗位也由此興起,大部分企業開始注重使用者體驗。
  • web3時代:透過區塊鏈、加密貨幣和非同質化代幣將權力以所有權的形式歸還使用者。

區塊鏈

區塊鏈(blockchain)就是使用雜湊指標區塊組成的連結串列.

區塊(block):累積了一定數量的交易後,會產生一次結算,把剛剛累積的交易資訊用高階密碼學打包成交易區塊。

鏈(chain):鏈會依照區塊結算的時間先後,把區塊一個個依序串連,形成鎖鏈一樣不斷延伸這條鏈。

創世紀塊: 第一個區塊, 區塊鏈的頭, 寫死在程式碼中。

對於 web3 前端從業人員來說,圖中每個區塊都可以看作是一臺伺服器,裡面保留了當前區塊打包的交易資料,在以太坊中,合約也部署在這樣的區塊中,它是透過一筆特殊的交易(receiver 是0地址)被打包進區塊。

後面會提到的 DApp (去中心化應用)本質上跟 web2 應用的區別就是:DApp 是從我們前端應用透過 RPC 訪問這些區塊中的資料,而以往的專案都是透過 http 請求從我們中心化的伺服器上獲取資料。

區塊

每個區塊包含兩個部分: 區塊頭(記錄當前區塊的特徵值)和區塊體(實際資料),其中區塊頭包含了當前區塊的多項特徵值:

  • 生成時間
  • 區塊體雜湊
  • 上一個區塊的雜湊
  • nonce
  • ...

區塊頭結構:

SizeFieldDescription
4 bytesVersionA version number to track software/protocol upgrades
32 bytesPrevious Block HashA reference to the hash of the previous (parent) block in the chain
32 bytesMerkle RootA hash of the root of the merkle tree of this block’s transactions
4 bytesTimestampThe approximate creation time of this block (seconds from Unix Epoch)
4 bytesDifficulty TargetThe Proof-of-Work algorithm difficulty target for this block
4 bytesNonceA counter used for the Proof-of-Work algorithm

區塊結構:

SizeFieldDescription
4 bytesBlock SizeThe size of the block, in bytes, following this field
80 bytesBlock HeaderSeveral fields form the block header
1–9 bytes (VarInt)Transaction CounterHow many transactions follow
VariableTransactionsThe transactions recorded in this block

塊高

塊高(block height)表示當前塊在區塊鏈中的位置,比如比特幣的創世區塊的區塊高度就是是0,這個高度是由時間推移和新塊產生而累加的。

加密貨幣

加密貨幣(crypto)是利於密碼學基礎確保交易安全及控制交易單位創造的交易媒介。常見的加密貨幣有比特幣(第一個加密貨幣)、以太幣(目前最火的幣)等等,加密貨幣是去中心化的,他不由銀行發行和驗證,而是一個對等系統,可以使任何地方的任何人發起交易。

密碼學基礎

加密貨幣的原理主要應用了密碼學基礎中雜湊演算法和非對稱加密。

如果大學課程有涉及都知道雜湊其實就是一種雜湊演算法,也就是將輸入值打亂輸出一系列雜湊值,雜湊值通常由短的字母數字組成。做過檔案上傳需求的都知道,上傳檔案前往往要計算檔案的MD5值,這是為了保證檔案的統一性,特別是在分片上傳時,服務端如何把支離破碎的檔案拼接起來,就是透過檔名、檔案內容的雜湊值對應其唯一性進行關聯的。還有一個例子是我們 github 上如果要透過 ssh 拉取倉庫程式碼(相比較 http 不需要輸入賬號密碼就能確認身份)需要在設定裡面配置 ssh 這個 ssh 是你本地生成的金鑰對中的公鑰,這個金鑰對是透過 SHA 演算法生成的,MD5SHA 都是雜湊演算法的典型代表。

由於雜湊值是有可能被反推並且產生雜湊碰撞的,所以在區塊鏈應用中,雜湊必須同時滿足以下三條性質:

  1. 輸入值必須足夠大,輸入值越大,理論上碰撞的機率就會越小。
  2. 不可逆,也就是沒法從雜湊結果反向推導或者輸入的規律。
  3. 保證挖礦難度,除了暴力列舉,沒有其他捷徑,這也是為什麼挖礦耗電的原因,因為礦機要24小時工作。

雜湊碰撞

簡單來說,雜湊碰撞就是輸入值不同,輸出值相同。為什麼會產生這種現象?

首先,這裡補充一個概念,前面說了雜湊演算法是一種雜湊演算法,把一串輸入轉成無規則的雜湊值,並且雜湊值往往是簡短的,也就是說,輸入值的可能性是無限的,但是雜湊表(一種 key - value 的對映關係表,為了解決查詢效率)的範圍是有限的,所以難免不同的輸入產生相同的輸出,這就產生了雜湊碰撞。但是也有對應的解決方案,這裡不做介紹。

那為什麼區塊鏈技術可以完全相信雜湊演算法?

2**256

這個號稱加密世界裡最強大的數字,2的256次方到底可不可靠?為什麼說他是安全的?SHA-256 真的不用擔心產生雜湊碰撞嗎?

相信我們大多數人都知道,電腦裡的GPU 可以飛快地進行大量平行計算,因此要是你專門讓GPU 反覆計算密碼雜湊函式,一個效能很好的GPU 每秒也許能算出接近10 億個雜湊值,假如你擁有一堆這樣的GPU,然後全部塞進電腦裡,讓你的電腦每秒能計算出40 億個雜湊值,那麼最開始的40 億,就代表了每臺電腦每秒算出的雜湊值數目,想像一下40 億臺這樣滿載GPU 的電腦_對比一下,雖然Google沒有對外公佈他們的伺服器數量,但有人估算大約有幾百萬臺,而現實中Google的大部分伺服器算力都不如我們滿載GPU 的電腦,不過我們假設Google把上百萬個伺服器全部換成滿載GPU 的電腦,那麼40 億臺電腦大概就相當於1000 個這種「打了雞血」的Google,為了更好地解釋,我們暫時把這種算力成為「Thousand Google」。

現在,全世界人口總數大約有73 億,接下來,我們假設有40 億人人手都擁有一臺這樣的「Thousand Google」電腦。然後,再想像一下有40 億個地球(作為對比,銀河系檢測到的恆星數量大約為1000-4000 億顆,雖然不太確定,但估算大致就在這個範圍),所以相當於銀河系1% 的恆星會有一個地球,並且這個地球上超過一半的人口都擁有自己的「Thousand Google」電腦。

接著想像有40 億個這樣的銀河系,我們把它叫做「億萬星系超級電腦」,每秒能猜「2 的160 次方」次。下面,40 億秒大概是126.8 年,而它的40 億倍就是5070 億年,差不多是宇宙年齡的37 倍,所以就算你有_滿載GPU 的40 億臺電腦+ 40 億人手一臺「Thousand Google」電腦 + 40 億個像地球一樣的行星 + 億萬星系超級電腦,再花上37 倍宇宙年齡的時間,也只有40 億分之一的可能性得到金鑰的正確答案。

順便提一下,目前比特幣的雜湊算力:把所有礦工都加起來,每秒能猜測並檢驗500 億億個雜湊值,只相當於之前提到的「Thousand Google」電腦算力的三分之一,不過礦工使用的是比GPU 算力強1000 倍左右的晶片,它叫做「專用積體電路(ASIC)」,這些硬體是為比特幣挖礦量身定做的,但這種晶片什麼都不會做,只會計算基於SHA256 演算法的雜湊值。但是在量子計算機真正普及之前,完全可以不用擔心他的安全性。

可以結合這個網站來觀察 SHA-256 演算法下輸入和輸出值的變化。

在比特幣網路中,就是應用了這種 SHA256 演算法,有趣的是,比特幣協議(的工作量證明)需要重複執行兩遍 SHA-256 演算法。請注意,這不是為了抵禦生日攻擊,畢竟在 hash(x) = hash(y) 的情況下,hash(hash(x)) = hash(hash(y)) 。雙重 SHA-256 旨在抵禦長度擴充套件攻擊。

從本質上來說,所謂的長度擴充套件攻擊,指的是如果惡意攻擊者知道了某個雜湊輸入的長度,就可以在雜湊值上新增一個秘密的字串、欺騙雜湊函式從其內部狀態的一個特定部分開始計算。作為 SHA2 演算法家族的一員,SHA256 也存在這一缺陷。因此,比特幣採取執行兩遍雜湊計算的方式來解決這一缺陷。

非對稱加密

交易時 私鑰簽名, 公鑰驗證。

隨機生成私鑰, 然後透過橢圓曲線乘法可以生成一系列公鑰。

比特幣不直接用公鑰作為地址, 而是做了一系列變換:

A = RIPEMD160(SHA256(K))

A: 地址
K: 公鑰

後續會再進行 base58 之類的編碼,總之公鑰和地址是一對一的,從公鑰能夠計算出地址,反之不行。

目前來說,你私鑰丟了是找不回來的,因此,一定要備份好你的助記詞或者秘鑰串。

挖礦

簡單來說就是盲猜 Nonce, 使得當前區塊雜湊 H(block header) <= target, 即前面必須有一定數目個0(例如 000000000000000000040b38097e0a61ef1ad31b184c908a738cfff013c094b2),其他節點可以根據nonce驗證你算出來的值是否符合條件。

Nonce 值的作用

  • 用來挖礦,可以想象成是一個控制新的區塊新增速度的開關,不能太快,也不能太慢,nonce 的範圍調大一點,難度越大,出塊速度就會下降。
  • 交易中的 Nonce 值 是指 from 賬戶發出交易的次數, 從0開始遞增,同一賬戶的交易會被依次確認。有以下幾個作用:

    • 確認交易順序
    • 防止double spending
    • 撤銷 pending 中的交易
    • 確定生成的合約地址

區塊鏈資料的不可篡改性

Merkle tree 儲存區塊中的交易資料,和 binary tree 類似, 但是有兩點不同:

  1. 使用雜湊指標
  2. 只有葉節點儲存交易資訊, 中間節點儲存左右子節點雜湊的雜湊

區塊頭包含很多內容,其中有當前區塊體的雜湊,還有上一個區塊的雜湊。這意味著,如果當前區塊體的內容變了,或者上一個區塊的雜湊變了,一定會引起當前區塊的雜湊改變,因此,只要校驗 Merkle Root Hash 就能檢測出區塊中交易是否有被篡改。

分叉

即使區塊鏈是可靠的,現在還有一個問題沒有解決:如果兩個人同時向區塊鏈寫入資料,也就是說,同時有兩個區塊加入,因為它們都連著前一個區塊,就形成了分叉。這時應該採納哪一個區塊呢?

現在的規則是,新節點總是採用最長的那條區塊鏈。如果區塊鏈有分叉,將看哪個分支在分叉點後面,先達到6個新區塊(稱為"六次確認")。按照10分鐘一個區塊計算,一小時就可以確認。

由於新區塊的生成速度由計算能力決定,所以這條規則就是說,擁有大多數計算能力的那條分支,就是正宗的區塊鏈。

共識機制

基於工作量證明 PoW

比特幣網路節點之間透過用算力投票來爭取記賬權。也就是礦工同時基於當前最長鏈都在本地構建一個本地最新區塊,誰先計算出符合要求的區塊,相當於誰獲得了當前區塊的記賬權。

假如多個節點同時計算出同一高度的區塊, 則區塊鏈會在短時間分叉, 每個節點會接收自己收到的第一個合法節點作為最長合法鏈,它也會基於這個區塊來計算下一個區塊,也就相當於投了這個區塊一票,最終肯定會有一條成為最長合法鏈,剩下的鏈就會被淘汰。

挖礦獎勵:挖礦消耗大量算力來保證區塊鏈安全,所以每個區塊產生都會獎勵區塊創造者一定量的比特幣。最初為 50BTC,每經過 21W 個區塊,獎勵減半。

基於股權證明 Pos

ETH 的出塊速度為十幾秒,出塊時間果斷導致分叉為常態, 並且極易出現多分支狀態,為了鼓勵礦工在出現分叉後快速達成一致, ETH 引入了 uncle block 獎勵機制:

  • 叔父區塊定義為七代以內的有共同祖先的區塊, 並且必須是分叉的第一個區塊
  • 每個區塊最多可包含兩個叔父區塊, 當前獲取記賬權的節點每提交一個叔父區塊可以額外獲得 1/32 出塊獎勵(出塊獎勵目前為 3ETH)的 ETH
  • 被提交的叔父區塊會根據所處的代數獲得 7/8 - 2/8 出塊獎勵的 ETH

與比特幣一樣,以太坊曾經也使用基於工作量證明共識協議(Pow),但是現在以太坊現在使用基於權益證明 (PoS) 的共識協議。

工作量證明是透過一定量的計算來驗證交易併產生新的區塊,與此不同的是,股權證明要求使用者擁有一定數量的加密貨幣,可以理解成他們把自己擁有的數字貨幣來換取股權,一旦被驗證他們打包有惡意交易,他們就會失去股權(加密貨幣)。

智慧合約

智慧合約是以太坊提出來的概念,可以理解為執行在以太坊區塊鏈上的程式碼,由於區塊鏈的不可篡改性,這種程式碼一旦你上鍊後就沒法修改bug了,所以區塊鏈行業程式碼審計業務成為了一些安全公司的核心的賺錢業務。

合約是一種以太坊賬戶,賬戶意味著有餘額,可以成為交易的目標,但是他不受使用者控制了,而且受已有的固定程式碼邏輯去執行,使用者賬戶需要提交執行合約中定義的函式來與它進行互動。

部署合約也是發生一筆交易的過程,本質上是給0地址傳送了一筆簽名後的交易資料。

總結

這節概括了以太坊和比特幣網路幾個重要概念,掌握基礎的理論和原理有助於加深對業務的理解,想深入瞭解區塊鏈技術的還是建議參考網上資料。

關注公眾號,回覆web3,加入前端web3交流群~

相關文章