【位元幣】公私鑰、地址、數字簽名與交易
資料整理自《精通位元幣第二版》
位元幣系統是基于密碼學的,但是與傳統意義上的加密系統不同,在位元幣系統中通信與交易的資料并沒有被加密,密碼學的運用,更多是用于證明資金的所有權,具體來看所有權,是通過公私鑰對、位元幣地址和數字簽名來實作的,
(1)公私鑰
位元幣系統中用戶的公私鑰對可在本地生成,并不需要連接到區塊鏈網路,由于非對稱加密的特性,公私鑰是成對出現的,更細致的看: 加密演算法先生成私鑰,接著由私鑰衍生出唯一的公鑰, 公鑰在進一步處理后,會成為地址,用于接收位元幣,而私鑰用于生成位元幣支付時的數字(交易)簽名,
一個用戶,可以任意生成多對公私鑰,即同一個用戶理論上可以掌握任意多的位元幣地址,錢包用于管理如此眾多的公私鑰對,類似于片夾的功能,

公私鑰生成機制:
(1)由系統隨機生成256位的二進制數,即生成了私鑰,
該程序只需要盡量保證“亂數”具有較強的隨機性,
(2)利用橢圓曲線演算法得到公鑰,
橢圓曲線演算法是一種“陷阱門”功能的函式,由私鑰推出公鑰很簡單,但是反向推導則(目前)難以短期實作,
具體的演算法是 K = k*G
其中,k為私鑰,G為生成點,K為公鑰,
所得的公鑰格式常常為:“前綴04”+“256位長的X坐標”+“256位長的Y坐標”
位元幣系統中,采用的secp256k1標準定義的一種特殊的橢圓曲線,
具體計算程序可以參考《精通位元幣 第二版》
(2)地址
理論上我們可以選擇將公鑰直接作為位元幣的“地址”,即轉賬的發起人或者收款人,但是現實是:公鑰過長會加重各節點負擔,且某些情況下交易一方非用戶,而是付款腳本,因此,需要將公鑰進一步處理成合適位長的地址,

利用單向哈希技術,公鑰進行SHA256、RIPEMD(160)之后會得到長度為160位(20個位元組)的字串,即為初始型的位元幣地址,接下來的Base58Check編碼程序,主要是將o、0、l、I等易混淆字符進行舍棄,同時會增加版本前綴、末端檢驗和,此時獲得了完整的位元幣地址,
(3)數字簽名
數字簽名,用于在不透漏私鑰的前提下證明自己擁有私鑰,位元幣中使用的數字簽名基于ECDSA(橢圓曲線數字簽名演算法),
數字簽名在位元幣中用途:
(1)證明簽名者授權資金使用;
(2)該授權證明不可否認;
(3)簽名證明交易(或交易的具體內容)在簽字后不可修改,
數字簽名生成與驗證機制:
(1)核心的創建程序

k是臨時私鑰,p是臨時公鑰;
R是臨時公鑰p的X坐標;
dA是簽名私鑰,即用戶私鑰;
m是交易資料(部分交易或者全部交易);
注意:此處臨時公私鑰生成方式與前述相同,
(2)驗證程序

R和S是簽名值;
Qa是用戶公鑰;
m是簽署的交易資料;
G是橢圓曲線發生器點;
如果計算得到的P的x坐標與R相同,即簽名有效,
(4)交易
交易是位元幣系統的核心,系統所有的設計為了確保交易可以正確生成、傳播、驗證、入鏈,限于概念過多,此處僅介紹交易生成環節,
什么是交易?
以下是一筆交易的具體示例:

在位元幣系統中,其實是先有輸出才有的輸入,只有在新交易中合法引入UTXO,才可以構建成合法的交易,
輸入 = 之前的未被花費的輸出(UTXO,Unspent Transaction Outputs)
那 如何驗證輸入合法?
通過查找txid找到區塊鏈中之前的UTXO,

可知,引入的UTXO中包含0.1BTC以及一個“鎖定腳本(scriptPubKey)”,
普遍情況下鎖定腳本包括 PubKHash ,

所以,當新的交易使用正確的“解鎖腳本”引入該UTXO時,才能算合法引入,
如下紅線中所示,即為引入該UTXO時提供的“解鎖腳本”,也就對應于上圖中sig欄位:

總結
在位元幣系統中,從一個交易產生、發送、驗證的角度來看,依次進行以下行為:
(1)用戶獨立生成若干公私鑰對,并產生同樣多個數的位元幣地址,
(2)當用戶要進行轉賬時,會構建一筆交易,交易的輸入部分為:該地址UTXO對應的交易id、解鎖該UTXO的腳本,輸出部分為:金額、鎖定腳本(即新的UTXO),
注意:解鎖腳本一般包括數字簽名和公鑰兩部分,特別的多入型交易中,需要針對不同的輸入地址生成不同的數字簽名,構建成功的交易整體,不需要再進行加密,
(3)交易產生后,通過區塊鏈網路進行傳播與分發,
(4)網路中接收到交易的其他節點會對該交易進行驗證,確保用戶在花費自己的BTC,驗證程序包括:通過每一筆輸入的txid獲得UTXO的具體細節,獲取鎖定腳本,驗證新交易中提供的解鎖腳本與之前的鎖定腳本是否匹配,如果回傳True,即確認該新交易有效,否則,丟棄,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/227983.html
標籤:區塊鏈

