【用Python自幹一個區塊鏈(2)】

李耕銘
Jan 4, 2021

--

現在遇到一個問題:

如果未經驗證就把交易紀錄送上鏈,那任意人都可以隨意移轉他人帳戶的餘額

很明顯這樣做是有問題的。因此接下來我們要處理的便是利用非對稱加密驗證發起交易者的身分與權限,其中又可以分成以下三個步驟:

  1. 利用非對稱加密中的RSA加密產生公、私鑰與地址
  2. 利用產生的公私鑰簽章後發送交易
  3. 試著跑起整個鏈並發起交易

非對稱式加密

區塊鏈只存在網路上,我們很明顯地無法透過身分證等文件去確認發起者的身分,因此這裡用到的是非對稱加密,這裡先簡短說明一下非對稱加密的功能:非對稱加密會得到兩把鑰匙:公鑰與私鑰,功能很簡單就一句話

可以公鑰加密私鑰解密,也可以私鑰加密公鑰解密。

也就是每個人在產生地址的時候同時會得到一把公鑰、一把私鑰,通常公鑰會釋出給對方,私鑰會自己持有以證明自己是該公鑰的持有者。

以上圖傳私訊給接收者為例,為了確保傳遞的訊息只有接收者能夠收到,因此我們使用非對稱加密來達成,步驟如下:

  1. 請接收者給我他的公鑰,即便公鑰被他人取走也無妨
  2. 透過接收者給的公鑰加密我們要傳的訊息
  3. 傳給接收者加密後的文件
  4. 只有持有私鑰的接收者有能力解密該文件

而區塊鏈驗證身分的方法恰恰與上面的例子相反,上面的例子是使用公鑰加密而後再用私鑰解密,通常是用在我們想傳遞私人訊息的時候會用上。

驗證身分則是透過私鑰把我們的交易紀錄加密,再讓外界使用公鑰解密,如果最後能夠以公鑰解密,就能夠確保這筆交易紀錄是公鑰持有人所簽核的,也就是使用私鑰加密交易紀錄、再使用公鑰解密,又稱之為數位簽章

一個交易經過了哪些步驟?

從發起交易到最後上鏈的過程經過上面這些步驟:

  1. 使用者利用私鑰簽署這筆交易
  2. 把這筆交易送到區塊鏈的節點並廣播
  3. 節點利用公鑰解密並驗證該筆交易的發起者
  4. 確認匯款人目前的餘額是否足夠
  5. 把該筆交易置入等待池(Pending Pool)
  6. 把該筆交易置入新區塊並據此生成 nonce

利用RSA加密產生公、私鑰與地址

在這裡我們使用RSA加密法隨機產生一對公私鑰,並且轉存成pkcs1形式:

我們的public_key(pkcs1)原本內容是這樣的

b'-----BEGIN RSA PUBLIC KEY-----\nMEgCQQCC+FnLB6c50HqIU1+xHmVr2ynahARbCc3/eRFLYSDeWKbVfvpMLnrKqm/qlmOy3QXjjr15ZNSQMO+Cnn0JvnohAgMBAAE=\n-----END RSA PUBLIC KEY-----\n'

我們把其中一些不必要與重複的內容過濾掉,只留下中間有意義的部分:

濾完之後剩下的部分便是它的公鑰,這時候我們可以直接把它當作地址來使用!

MEgCQQCC+FnLB6c50HqIU1+xHmVr2ynahARbCc3/eRFLYSDeWKbVfvpMLnrKqm/qlmOy3QXjjr15ZNSQMO+Cnn0JvnohAgMBAAE=

這就是我們常看到在區塊鏈上看到的一連串像是隨機位元組的地址由來了!

在區塊鏈接納這筆交易前,先試著用地址反推回原本的公鑰,再用公鑰解密當初這筆交易紀錄的簽章看看,如果公鑰解的開就可以代表這筆交易的確是公鑰持有人本人用持有的私鑰所簽核的,這便是剛剛提到的”數位簽章”。

利用產生的公私鑰簽章後發送交易

產生公私鑰後,先透過initialize_transaction初始化一筆交易,這時候可以利用昨天寫好的get_balance函式先確定發送者的帳戶餘額是否足夠,初始化之後便可以透過sign_transaction簽署。

initialize_transactionsign_transaction這兩個動作都是在客戶的本地端做,以避免私鑰外洩的風險。簽署好之後使用add_transaction把交易紀錄與簽署發到鏈上去等待礦工確認,因為我們有簽署過,所以礦工使用公鑰對簽署解密便可以確認這筆交易的確是由我們發出的。

因此實際使用上可以分成三個步驟

  1. 初始化一筆交易紀錄
  2. 利用私鑰簽署這筆交易
  3. 送上鏈上等待礦工驗證與處理

試著跑起整個鏈並發起交易

接著就可以跑起整條鏈了!首先先為我們自己開一個地址,接著創造創世塊。然後便可以不停地挖掘新區塊→調整難度→挖掘新區塊→調整難度→….周而復始,而且中間還可以發起交易!

文章列表:

  1. 定義基本架構、功能與格式
    http://bit.ly/3rPRrtE
  2. 利用非對稱加密簽署並發送交易
    http://bit.ly/3og5jLF
  3. 製作節點與用戶端程式
    http://bit.ly/2KVXBb2
  4. 節點間的廣播與同步
    http://bit.ly/394aurx

工商服務

我在台大資工訓練班有開設相關區塊鏈課程,有興趣的可以參考。
https://train.csie.ntu.edu.tw/train/course.php?id=3174

本章的程式碼如下:

--

--