當前位置:首頁 » 比特幣問答 » 比特幣交易驗證解鎖腳本簽名

比特幣交易驗證解鎖腳本簽名

發布時間: 2023-07-30 21:38:13

A. 4. 比特幣的密鑰、地址和錢包 - 精通比特幣筆記

比特幣的所有權是通過密鑰、比特幣地址和數字簽名共同確定的。密鑰不存在於比特幣網路中,而是用戶自己保存,或者利用管理私鑰的軟體-錢包來生成及管理。

比特幣的交易必須有有效簽名才會被存儲在區塊中,因此擁有密鑰就擁有對應賬戶中的比特幣。密鑰都是成對出現的,由一個公鑰和一個私鑰組成。公鑰相當於銀行賬號,私鑰就相當於銀行卡密碼。通常情況下密鑰由錢包軟體管理,用戶不直接使用密鑰。

比特幣地址通常是由公鑰計算得來,也可以由比特幣腳本得來。

比特幣私鑰通常是數字,由比特幣系統隨機( 因為演算法的可靠性與隨機性正相關,所以隨機性必須是真隨機,不是偽隨機,因此比特幣系統可以作為隨機源來使用 )生成,然後將私鑰作為輸入,使用橢圓曲線演算法這個單向加密函數生成對應的公鑰,再將公鑰作為輸入,使用單向加密哈希函數生成地址。例如,通過公鑰K得到地址A的計算方式為:

其中SHA256和PIPEMD160被稱為雙哈希或者HASH160,Base58Check是帶有驗證功能的Base58編碼,驗證方式為先計算原始數據(編碼前)的驗證碼,再比較編碼後數據的驗證碼,相同則地址有效,否則無效。而在使用Base58Check編碼前,需要對數據做處理。
處理方式為: 版本前綴 + 雙哈希後的數據 + 校驗碼
其中版本前綴是自定義的,如比特幣私鑰的前綴是0x80,校驗碼是把版本前綴和雙哈希後的數據拼接起來,進行兩次SHA256計算,取前4位元組。得到處理的數據後,再進行Base58編碼,得到最終的結果。

下圖是Base58Check版本前綴和Base58編碼後的結果

密鑰可以採用不同的編碼格式,得到的編碼後結果雖然不同,但密鑰本身沒有任何變化,採用哪種編碼格式,就看情況而論了,最終目的都是方便人們准確無誤的使用和識別密鑰。
下圖是相同私鑰採用不同編碼方式的結果:

公鑰也有很多種格式,不過最重要的是公鑰被分為壓縮格式和非壓縮格式,帶04前綴的公鑰為非壓縮格式的公鑰,而03,02開頭的標識壓縮格式的公鑰。

前面說過,公鑰是橢圓曲線上的一個點,由一對坐標(x, y)表示,再加上前綴,公鑰可以表示為:前綴 x y。
比如一個公鑰的坐標為:

以非壓縮格式為例,公鑰為(略長):

壓縮格式的公鑰可以節省一定的存儲,對於每天成千上萬的比特幣交易記錄來說,這一點點的節省能起到很大效果。

因為橢圓曲線實際上是一個方程(y2 mod p = (x3 + 7)mod P, y2是y的平方,x3是x的立方),而公鑰是橢圓曲線上的一個點,那麼公鑰即為方程的一個解,如果公鑰中只保留x,那麼可以通過解方程得到y,而壓縮公鑰格式有兩個前綴是因為對y2開方,會得到正負兩個解,在素數p階的有限域上使用二進制算術計算橢圓曲線的時候,y坐標或奇或偶,所以用02表示y為奇數,03表示y為偶數。

所以壓縮格式的公鑰可以表示為:前綴x
以上述公鑰的坐標為准,y為奇數為例,公鑰K為:

不知道大家發現沒有,這種壓縮方式存在一個問題,即一個私鑰可以得出兩個公鑰,壓縮和非壓縮公鑰,而這兩個公鑰都對應同一個私鑰,都合法,但生成的比特幣地址卻不相同,這就涉及到錢包軟體的實現方式,是使用壓縮公鑰還是非壓縮公鑰,或者二者皆用,這個問題後面來介紹。

比特幣錢包最主要的功能就是替用戶保管比特幣私鑰,比特幣錢包有很多種,比如非確定性(隨機)錢包,確定性(種子)錢包。所謂的非確定性是指錢包運行時會生成足夠的私鑰(比如100個私鑰),每個私鑰僅會使用一次,這樣私鑰管理就很麻煩。確定性錢包擁有一個公共種子,單向離散方程使用種子生成私鑰,種子足夠回收所有私鑰,所以在錢包創建時,簡單備份下,就可以在錢包之間轉移輸入。

這里要特別介紹下助記碼詞彙。助記碼詞彙是英文單詞序列,在BIP0039中提出。這些序列對應著錢包中的種子,種子可以生成隨機數,隨機數生成私鑰,私鑰生成公鑰,便有了你需要的一切。所以單詞的順序就是錢包的備份,通過助記碼詞彙能重建錢包,這比記下一串隨機數要強的多。

BIP0039定義助記碼和種子的創建過程如下:

另外一種重要的錢包叫做HD錢包。HD錢包提供了隨機(不確定性) 鑰匙有兩個主要的優勢。
第一,樹狀結構可以被用來表達額外的組織含義。比如當一個特定分支的子密鑰被用來接收交易收入並且有另一個分支的子密鑰用來負責支付花費。不同分支的密鑰都可以被用在企業環境中,這就可以支配不同的分支部門,子公司,具體功能以及會計類別。
第二,它可以允許讓使用者去建立一個公共密鑰的序列而不需要訪問相對應的私鑰。這可允許HD錢包在不安全的伺服器中使用或者在每筆交易中發行不同的公共鑰匙。公共鑰匙不需要被預先載入或者提前衍生,但是在伺服器中不具有可用來支付的私鑰。

BIP0038提出了一個通用標准,使用一個口令加密私鑰並使用Base58Check對加密的私鑰進行編碼,這樣加密的私鑰就可以安全地保存在備份介質里,安全地在錢包間傳輸,保持密鑰在任何可能被暴露情況下的安全性。這個加密標准使用了AES,這個標准由NIST建立,並廣泛應用於商業和軍事應用的數據加密。

BIP0038加密方案是: 輸入一個比特幣私鑰,通常使用WIF編碼過,base58chek字元串的前綴「5」。此外BIP0038加密方案需要一個長密碼作為口令,通常由多個單詞或一段復雜的數字字母字元串組成。BIP0038加密方案的結果是一個由base58check編碼過的加密私鑰,前綴為6P。如果你看到一個6P開頭的的密鑰,這就意味著該密鑰是被加密過,並需個口令來轉換(解碼) 該密鑰回到可被用在任何錢包WIF格式的私鑰(前綴為5)。許多錢包APP現在能夠識別BIP0038加密過的私鑰,會要求用戶提供口令解碼並導入密鑰。

最通常使用BIP0038加密的密鑰用例是紙錢包一一張紙張上備份私鑰。只要用戶選擇了強口令,使用BIP0038加密的私鑰的紙錢包就無比的安全,這也是一種很棒的比特幣離線存儲方式(也被稱作「冷存儲」)。

P2SH函數最常見的實現時用於多重簽名地址腳本。顧名思義,底層腳本需要多個簽名來證明所有權,然後才能消費資金。這類似在銀行開設一個聯合賬戶。

你可以通過計算,生成特殊的比特幣地址,例如我需要一個Hello開頭的地址,你可以通過腳本來生成這樣一個地址。但是每增加一個字元,計算量會增加58倍,超過7個字元,需要專門的硬體或者礦機來生成,如果是8~10個字元,那麼計算量將無法想像。

B. 比特幣基礎知識 你絕對想不到


橢圓曲線數字簽名演算法
橢圓曲線數字簽名演算法(ECDSA)是使用橢圓曲線對數字簽名演算法(DSA)的模擬,該演算法是構成比特幣系統的基石。
私鑰
非公開,擁有者需安全保管。通常是由隨機演算法生成的,說白了,就是一個巨大的隨機整數,32位元組,256位。
大小介於1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間的數,都可以認為是一個合法的私鑰。
於是,除了隨機方法外,採用特定演算法由固定的輸入,得到32位元組輸出的演算法就可以成為得到私鑰的方法。於是,便有了迷你私鑰(Mini Privkey),原理很簡單,例如,採用SHA256的一種實現:
private key = SHA256()1
迷你私鑰存在安全問題,因為輸入集合太小,易被構造常見組合的彩虹表暴力破解,所以通常仿輪納還是使用系統隨機生成的比較好,無安全隱患。
公鑰
公鑰與私鑰是相對應的,一把私鑰可以推出唯一的公鑰,但公鑰卻無法推導出私鑰。公鑰有兩種形式:壓縮與非壓縮。
早期比特幣均使用非壓縮公鑰,現大部分客戶端已默認使用壓縮公鑰。
這個貌似是比特幣系統一個長得像feature的bug,早期人少活多代碼寫得不夠精細,openssl庫的文檔又不足夠好,導致Satoshi以為必須使用非壓縮的完整公鑰,後來大家發現其實公鑰的左右兩個32位元組是有關聯的,左側(X)可以推出右側(Y)的平方值,有左側(X)就可以了。
現在系統里兩種方式共存,應該會一直共存下去。兩種公鑰的首個位元組為標識位,壓縮為33位元組,非壓縮為65位元組。以0x04開頭為非壓縮,0x02/0x03開頭為壓縮公鑰,0x02/0x03的選取由右側Y開方後的奇偶決定。
壓縮形式可以減小Tx/Block的體積,每個Tx Input減少32位元組。
簽名
使用私鑰對數據進行簽署(Sign)會得到簽名(Signature)。通常會將數據先生成Hash值,然後對此Hash值進行簽名。簽名(signature)有兩部分組成: R + S。由簽名(signature)與Hash值,便可以推出一個公鑰,驗證此公鑰,便可知道此簽名是否由公鑰對應的私鑰簽名。
通常,每個簽名會有三個長度:73、72、71,符合校驗的概率為25%、50%、25%。所以每次簽署後,需要找出符合校驗的簽名長度,再提供給驗證方。
地址
地址是為了人們交換方便而弄出來的一個方案,因為公鑰太長了(130字元串或66字元串)。地址長度為25位元組,轉為base58編碼後,為34或35個字元。base58是類似base64的編碼,但去掉了易引起視覺混淆的字元,又在地址末尾添加了4個位元組校驗位,保障在人們交換個別字元錯誤時,也能夠因地址校驗失敗而制止了誤操作。
由於存在公鑰有兩種形式,那麼一個公鑰便對應兩個地址。這兩個地址都可由同一私鑰簽署交易。
公鑰生成地址的演算法:
Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111
Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))
Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)1234
下圖是非壓縮公鑰生成地址的過程:
對於壓縮公鑰生成地址時,則只取公鑰的X部分即可。
推導關系
三者推導關系:私鑰
公鑰
兩個地址。過程均不可逆。擁有私鑰便擁有一切,但通常為了方便,會把對應的公鑰、地址也存儲起來。
交易
比特幣的交易(Transation,縮寫Tx),並不是通常意義的桐散交易,例如一手交錢一手交貨,而是轉賬。交易由N個輸入和M個輸出兩部分組成。交易的每個輸入便是前向交易的某個輸出,那麼追蹤到源頭,必然出現一個沒有輸入的交易,此類交易稱為CoinBase Tx。CoinBase類備沒交易是獎勵挖礦者而產生的交易,該交易總是位於Block塊的第一筆。
擁有一個輸入與輸出的Tx數據:
Input:
Previous tx:
Index: 0
scriptSig:
241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160
OP_EQUALVERIFY OP_CHECKSIG12345678910
一旦某個Tx的第N個輸出成為另一個Tx的輸入,那麼該筆比特幣即為已花費。每個交易有唯一Hash字元串來標識,通過對交易數據做兩次SHA256哈希運算而來:
Tx Hash ID = SHA256(SHA256(Tx Data))1
礦工費
礦工費(Transaction Fee)是鼓勵礦工將Tx打包進Block的激勵報酬。計算一筆交易的礦工費:
Transaction Fee = SUM(Inputs amount) - SUM(Outputs amount)1
每筆Tx的礦工費必然大於等於零,否則該筆Tx即為非法,不會被網路接收。
數據塊
數據塊(Block)是存儲Block Meta與Tx的地方。Block的第一筆Tx總是CoinBase Tx,因此Block中的交易數量總是大於等於1,隨後是這段時間內網路廣播出來的Tx。
找到合適的Block是一件非常困難的事情,需要通過大量的數學計算才能發現,該計算過程稱為「挖礦」。首個發現者,會得到一些比特幣作為獎勵。
數據鏈
多個Block連接起來成為數據鏈(Block Chain)。
為了引入容錯與競爭機制,比特幣系統允許Block Chain出現分叉,但每個節點總是傾向於選擇最高的、難度最大的鏈,並稱之為Best Chain,節點只認可Best Chain上的數據。
首個Block稱為Genesis Block,並設定高度為零,後續每新增一個Block,高度則遞增一。目前是不允許花費Genesis Block中的比特幣的。
每個Block中的Tx在此Block中均唯一
一個Tx通常只會在一個Block里,也可能會出現在多個Block中,但只會在Best Chain中的某一個Block出現一次
貨幣存儲
比特幣是密碼貨幣、純數字化貨幣,沒有看得見摸得著的硬幣或紙幣。一個人持有比特幣意味著:
其擁有一些地址的私鑰
這些地址是數筆交易的輸出,且未花費
所有貨幣記錄均以交易形式存儲在整個blockchain數據塊中,無交易無貨幣。貨幣不會憑空產生,也不會憑空消失。遺失了某個地址的私鑰,意味著該地址上的Tx無法簽署,無法成為下一個Tx的輸入,便認為該筆比特幣永久消失了。
貨幣發行
既然所有交易的輸入源頭都是來自CoinBase,產生CoinBase時即意味著貨幣發行。比特幣採用衰減發行,每四年產量減半,第一個四年每個block的coinbase獎勵50BTC,隨後是25btc, 12.5btc, 並最終於2140年為零,此時總量達到極限為2100萬個btc。
減半周期,嚴格來說,並不是准確的四年,而是每生成210000個block。之所以俗稱四年減半,是因為比特幣系統會根據全網算力的大小自動調整難度系統,使得大約每兩周產生2016個block,那麼四年約21萬塊block。
該函數GetBlockValue()用於計算挖得Block的獎勵值:
int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
nSubsidy = (nHeight / 210000);
return nSubsidy + nFees;
}123456789
當達到2100萬btc以後,不再有來自CoinBase的獎勵了,礦工的收入來源僅剩下交易的礦工費。此時,每個block的收入絕對值btc很低,但此時比特幣應當會非常繁榮,幣值也會相當的高,使得礦工們依然有利可圖。
杜絕多重支付
傳統貨幣存在多重支付(Double Spending)問題,典型的比如非數字時代的支票詐騙、數字時代的信用卡詐騙等。在比特幣系統里,每筆交易的確認均需要得到全網廣播,並收錄進Block後才能得到真正確認。每筆錢的花銷,均需要檢測上次輸入交易的狀態。數據是帶時間戳的、公開的,BlockChain由巨大的算力保障其安全性。所以比特幣系統將貨幣的多重支付的風險極大降低,幾近於零。通過等待多個Block確認,更是從概率上降低至零。一般得到6個確認後,可認為非常安全。但對於能影響你人生的重大支付,建議等待20~30個確認。
匿名性
任何人均可以輕易生成大量的私鑰、公鑰、地址。地址本身是匿名的,通過多個地址交易可進一步提高匿名性。但該匿名性並不像媒體宣傳的那樣,是某種程度上的匿名。因為比特幣的交易數據是公開的,所以任何一筆資金的流向均是可以追蹤的。
不了解比特幣的人為它的匿名性產生一些擔憂,比如擔心更利於從事非法業務;了解比特幣的人卻因為它的偽匿名性而苦惱。傳統貨幣在消費中也是匿名的,且是法律保障的,大部分國家都不允許個人塗畫紙幣。
地址本身是匿名的,但你可以通過地址對應的私鑰簽名消息來向公眾證明你擁有某個比特幣地址。
其他名詞
哈希
哈希(Hash)是一種函數,將一個數映射到另一個集合當中。不同的哈希函數映射的空間不同,反映到計算機上就是生成的值長度不一樣。同一個哈希函數,相同的輸入必然是相同的輸出,但同一個輸出卻可能有不同的輸入,這種情況稱為哈希碰撞。
常見的哈希函數有CRC32, MD5, SHA1, SHA-256, SHA-512, RIPEMD-160等,哈希函數在計算中有著非常廣泛的用途。比特幣里主要採用的是SHA-256和RIPEMD-160。
腦錢包紙錢包
前面提到過的腦錢包與紙錢包,這其實不算是錢包的分類,只是生成、存儲密鑰的方式而已。腦錢包屬於迷你私鑰的產物。腦錢包就是記在腦袋裡的密鑰,紙錢包就是列印到紙上的密鑰,僅此而已。
有同學提到過,以一個計算機文件作為輸入,例如一個數MB大小的照片,通過某種Hash運算後得到私鑰的方法。這個方案的安全性還是不錯的,同時可以防止盜私鑰木馬根據特徵掃描私鑰。文本形式存儲私鑰是有特徵的,而一個照片文件卻難以察覺,即使放在雲盤等第三方存儲空間中都是安全的。

C. 什麼是比特幣的數字簽名

比特幣中的數字簽名,是交易中的發起方產生的,為了保證這筆交易確實是由此人發起,並且數據在傳輸時沒有被篡改。數字簽名簡單點來說,就是完整的交易信息,通過數字摘要技術壓縮成固定格式的字元串,然後通過非對稱加密技術,生成一個私鑰。將完整的交易信息和數字簽名傳送給礦工,礦工用交易發起方的公鑰對數字簽名進行解密,解密成功,就將此交易數據寫到區塊中。

D. 詳解比特幣挖礦原理

可以將區塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網路中的每個參與者都把它看作一本所有權的權威記錄。

比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。

至今為止,在主幹區塊鏈上,沒有發生一起成功的攻擊,一次都沒有。

通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鍾產生一個新區塊,每一個新區塊都伴隨著一定數量從無到有的全新比特幣。每開采210,000個塊,大約耗時4年,貨幣發行速率降低50%。

在2016年的某個時刻,在第420,000個區塊被「挖掘」出來之後降低到12.5比特幣/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新幣的發行速度會以指數形式進行64次「二等分」。到那時每區塊發行比特幣數量變為比特幣的最小貨幣單位——1聰。最終,在經過1,344萬個區塊之後,所有的共20,999,999.9769億聰比特幣將全部發行完畢。換句話說, 到2140年左右,會存在接近2,100萬比特幣。在那之後,新的區塊不再包含比特幣獎勵,礦工的收益全部來自交易費。

在收到交易後,每一個節點都會在全網廣播前對這些交易進行校驗,並以接收時的相應順序,為有效的新交易建立一個池(交易池)。

每一個節點在校驗每一筆交易時,都需要對照一個長長的標准列表:

交易的語法和數據結構必須正確。

輸入與輸出列表都不能為空。

交易的位元組大小是小於MAX_BLOCK_SIZE的。

每一個輸出值,以及總量,必須在規定值的范圍內 (小於2,100萬個幣,大於0)。

沒有哈希等於0,N等於-1的輸入(coinbase交易不應當被中繼)。

nLockTime是小於或等於INT_MAX的。

交易的位元組大小是大於或等於100的。

交易中的簽名數量應小於簽名操作數量上限。

解鎖腳本(Sig)只能夠將數字壓入棧中,並且鎖定腳本(Pubkey)必須要符合isStandard的格式 (該格式將會拒絕非標准交易)。

池中或位於主分支區塊中的一個匹配交易必須是存在的。

對於每一個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕。

對於每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易將成為一個孤立的交易。如果與其匹配的交易還沒有出現在池中,那麼將被加入到孤立交易池中。

對於每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個確認。

對於每一個輸入,引用的輸出是必須存在的,並且沒有被花費。

使用引用的輸出交易獲得輸入值,並檢查每一個輸入值和總值是否在規定值的范圍內 (小於2100萬個幣,大於0)。

如果輸入值的總和小於輸出值的總和,交易將被中止。

如果交易費用太低以至於無法進入一個空的區塊,交易將被拒絕。

每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。

以下挖礦節點取名為 A挖礦節點

挖礦節點時刻監聽著傳播到比特幣網路的新區塊。而這些新加入的區塊對挖礦節點有著特殊的意義。礦工間的競爭以新區塊的傳播而結束,如同宣布誰是最後的贏家。對於礦工們來說,獲得一個新區塊意味著某個參與者贏了,而他們則輸了這場競爭。然而,一輪競爭的結束也代表著下一輪競爭的開始。

驗證交易後,比特幣節點會將這些交易添加到自己的內存池中。內存池也稱作交易池,用來暫存尚未被加入到區塊的交易記錄。

A節點需要為內存池中的每筆交易分配一個優先順序,並選擇較高優先順序的交易記錄來構建候選區塊。

一個交易想要成為「較高優先順序」,需滿足的條件:優先值大於57,600,000,這個值的生成依賴於3個參數:一個比特幣(即1億聰),年齡為一天(144個區塊),交易的大小為250個位元組:

High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000

區塊中用來存儲交易的前50K位元組是保留給較高優先順序交易的。 節點在填充這50K位元組的時候,會優先考慮這些最高優先順序的交易,不管它們是否包含了礦工費。這種機制使得高優先順序交易即便是零礦工費,也可以優先被處理。

然後,A挖礦節點會選出那些包含最小礦工費的交易,並按照「每千位元組礦工費」進行排序,優先選擇礦工費高的交易來填充剩下的區塊。

如區塊中仍有剩餘空間,A挖礦節點可以選擇那些不含礦工費的交易。有些礦工會竭盡全力將那些不含礦工費的交易整合到區塊中,而其他礦工也許會選擇忽略這些交易。

在區塊被填滿後,內存池中的剩餘交易會成為下一個區塊的候選交易。因為這些交易還留在內存池中,所以隨著新的區塊被加到鏈上,這些交易輸入時所引用UTXO的深度(即交易「塊齡」)也會隨著變大。由於交易的優先值取決於它交易輸入的「塊齡」,所以這個交易的優先值也就隨之增長了。最後,一個零礦工費交易的優先值就有可能會滿足高優先順序的門檻,被免費地打包進區塊。

UTXO(Unspent Transaction Output) : 每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是「未花費過的交易輸出」,也就是 UTXO。

塊齡:UTXO的「塊齡」是自該UTXO被記錄到區塊鏈為止所經歷過的區塊數,即這個UTXO在區塊鏈中的深度。

區塊中的第一筆交易是筆特殊交易,稱為創幣交易或者coinbase交易。這個交易是由挖礦節點構造並用來獎勵礦工們所做的貢獻的。假設此時一個區塊的獎勵是25比特幣,A挖礦的節點會創建「向A的地址支付25.1個比特幣(包含礦工費0.1個比特幣)」這樣一個交易,把生成交易的獎勵發送到自己的錢包。A挖出區塊獲得的獎勵金額是coinbase獎勵(25個全新的比特幣)和區塊中全部交易礦工費的總和。

A節點已經構建了一個候選區塊,那麼就輪到A的礦機對這個新區塊進行「挖掘」,求解工作量證明演算法以使這個區塊有效。比特幣挖礦過程使用的是SHA256哈希函數。

用最簡單的術語來說, 挖礦節點不斷重復進行嘗試,直到它找到的隨機調整數使得產生的哈希值低於某個特定的目標。 哈希函數的結果無法提前得知,也沒有能得到一個特定哈希值的模式。舉個例子,你一個人在屋裡打檯球,白球從A點到達B點,但是一個人推門進來看到白球在B點,卻無論如何是不知道如何從A到B的。哈希函數的這個特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機修改輸入,直到出現適當的哈希值。

需要以下參數

• block的版本 version

• 上一個block的hash值: prev_hash

• 需要寫入的交易記錄的hash樹的值: merkle_root

• 更新時間: ntime

• 當前難度: nbits

挖礦的過程就是找到x使得

SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET

上式的x的范圍是0~2^32, TARGET可以根據當前難度求出的。

簡單打個比方,想像人們不斷扔一對色子以得到小於一個特定點數的游戲。第一局,目標是12。只要你不扔出兩個6,你就會贏。然後下一局目標為11。玩家只能扔10或更小的點數才能贏,不過也很簡單。假如幾局之後目標降低為了5。現在有一半機率以上扔出來的色子加起來點數會超過5,因此無效。隨著目標越來越小,要想贏的話,扔色子的次數會指數級的上升。最終當目標為2時(最小可能點數),只有一個人平均扔36次或2%扔的次數中,他才能贏。

如前所述,目標決定了難度,進而影響求解工作量證明演算法所需要的時間。那麼問題來了:為什麼這個難度值是可調整的?由誰來調整?如何調整?

比特幣的區塊平均每10分鍾生成一個。這就是比特幣的心跳,是貨幣發行速率和交易達成速度的基礎。不僅是在短期內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鍾一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動態的參數,會定期調整以達到每10分鍾一個新區塊的目標。簡單地說,難度被設定在,無論挖礦能力如何,新區塊產生速率都保持在10分鍾一個。

那麼,在一個完全去中心化的網路中,這樣的調整是如何做到的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊(2周產生的區塊)中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鍾(兩周,即這些區塊以10分鍾一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網路發現區塊產生速率比10分鍾要快時會增加難度。如果發現比10分鍾慢時則降低難度。

為了防止難度的變化過快,每個周期的調整幅度必須小於一個因子(值為4)。如果要調整的幅度大於4倍,則按4倍調整。由於在下一個2,016區塊的周期不平衡的情況會繼續存在,所以進一步的難度調整會在下一周期進行。因此平衡哈希計算能力和難度的巨大差異有可能需要花費幾個2,016區塊周期才會完成。

舉個例子,當前A節點在挖277,316個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第277,316個區塊(父區塊為277,315)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。

比特幣共識機制的第三步是通過網路中的每個節點獨立校驗每個新區塊。當新區塊在網路中傳播時,每一個節點在將它轉發到其節點之前,會進行一系列的測試去驗證它。這確保了只有有效的區塊會在網路中傳播。

每一個節點對每一個新區塊的獨立校驗,確保了礦工無法欺詐。在前面的章節中,我們看到了礦工們如何去記錄一筆交易,以獲得在此區塊中創造的新比特幣和交易費。為什麼礦工不為他們自己記錄一筆交易去獲得數以千計的比特幣?這是因為每一個節點根據相同的規則對區塊進行校驗。一個無效的coinbase交易將使整個區塊無效,這將導致該區塊被拒絕,因此,該交易就不會成為總賬的一部分。

比特幣去中心化的共識機制的最後一步是將區塊集合至有最大工作量證明的鏈中。一旦一個節點驗證了一個新的區塊,它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。

節點維護三種區塊:

· 第一種是連接到主鏈上的,

· 第二種是從主鏈上產生分支的(備用鏈),

· 第三種是在已知鏈中沒有找到已知父區塊的。

有時候,新區塊所延長的區塊鏈並不是主鏈,這一點我們將在下面「 區塊鏈分叉」中看到。

如果節點收到了一個有效的區塊,而在現有的區塊鏈中卻未找到它的父區塊,那麼這個區塊被認為是「孤塊」。孤塊會被保存在孤塊池中,直到它們的父區塊被節點收到。一旦收到了父區塊並且將其連接到現有區塊鏈上,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的一部分。當兩個區塊在很短的時間間隔內被挖出來,節點有可能會以相反的順序接收到它們,這個時候孤塊現象就會出現。

選擇了最大難度的區塊鏈後,所有的節點最終在全網范圍內達成共識。隨著更多的工作量證明被添加到鏈中,鏈的暫時性差異最終會得到解決。挖礦節點通過「投票」來選擇它們想要延長的區塊鏈,當它們挖出一個新塊並且延長了一個鏈,新塊本身就代表它們的投票。

因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持一致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是, 每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。

當有兩個候選區塊同時想要延長最長區塊鏈時,分叉事件就會發生。正常情況下,分叉發生在兩名礦工在較短的時間內,各自都算得了工作量證明解的時候。兩個礦工在各自的候選區塊一發現解,便立即傳播自己的「獲勝」區塊到網路中,先是傳播給鄰近的節點而後傳播到整個網路。每個收到有效區塊的節點都會將其並入並延長區塊鏈。如果該節點在隨後又收到了另一個候選區塊,而這個區塊又擁有同樣父區塊,那麼節點會將這個區塊連接到候選鏈上。其結果是,一些節點收到了一個候選區塊,而另一些節點收到了另一個候選區塊,這時兩個不同版本的區塊鏈就出現了。

分叉之前

分叉開始

我們看到兩個礦工幾乎同時挖到了兩個不同的區塊。為了便於跟蹤這個分叉事件,我們設定有一個被標記為紅色的、來自加拿大的區塊,還有一個被標記為綠色的、來自澳大利亞的區塊。

假設有這樣一種情況,一個在加拿大的礦工發現了「紅色」區塊的工作量證明解,在「藍色」的父區塊上延長了塊鏈。幾乎同一時刻,一個澳大利亞的礦工找到了「綠色」區塊的解,也延長了「藍色」區塊。那麼現在我們就有了兩個區塊:一個是源於加拿大的「紅色」區塊;另一個是源於澳大利亞的「綠色」。這兩個區塊都是有效的,均包含有效的工作量證明解並延長同一個父區塊。這個兩個區塊可能包含了幾乎相同的交易,只是在交易的排序上有些許不同。

比特幣網路中鄰近(網路拓撲上的鄰近,而非地理上的)加拿大的節點會首先收到「紅色」區塊,並建立一個最大累計難度的區塊,「紅色」區塊為這個鏈的最後一個區塊(藍色-紅色),同時忽略晚一些到達的「綠色」區塊。相比之下,離澳大利亞更近的節點會判定「綠色」區塊勝出,並以它為最後一個區塊來延長區塊鏈(藍色-綠色),忽略晚幾秒到達的「紅色」區塊。那些首先收到「紅色」區塊的節點,會即刻以這個區塊為父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受「綠色」區塊的節點會以這個區塊為鏈的頂點開始生成新塊,延長這個鏈。

分叉問題幾乎總是在一個區塊內就被解決了。網路中的一部分算力專注於「紅色」區塊為父區塊,在其之上建立新的區塊;另一部分算力則專注在「綠色」區塊上。即便算力在這兩個陣營中平均分配,也總有一個陣營搶在另一個陣營前發現工作量證明解並將其傳播出去。在這個例子中我們可以打個比方,假如工作在「綠色」區塊上的礦工找到了一個「粉色」區塊延長了區塊鏈(藍色-綠色-粉色),他們會立刻傳播這個新區塊,整個網路會都會認為這個區塊是有效的,如上圖所示。

所有在上一輪選擇「綠色」區塊為勝出者的節點會直接將這條鏈延長一個區塊。然而,那些選擇「紅色」區塊為勝出者的節點現在會看到兩個鏈: 「藍色-綠色-粉色」和「藍色-紅色」。 如上圖所示,這些節點會根據結果將 「藍色-綠色-粉色」 這條鏈設置為主鏈,將 「藍色-紅色」 這條鏈設置為備用鏈。 這些節點接納了新的更長的鏈,被迫改變了原有對區塊鏈的觀點,這就叫做鏈的重新共識 。因為「紅」區塊做為父區塊已經不在最長鏈上,導致了他們的候選區塊已經成為了「孤塊」,所以現在任何原本想要在「藍色-紅色」鏈上延長區塊鏈的礦工都會停下來。全網將 「藍色-綠色-粉色」 這條鏈識別為主鏈,「粉色」區塊為這條鏈的最後一個區塊。全部礦工立刻將他們產生的候選區塊的父區塊切換為「粉色」,來延長「藍色-綠色-粉色」這條鏈。

從理論上來說,兩個區塊的分叉是有可能的,這種情況發生在因先前分叉而相互對立起來的礦工,又幾乎同時發現了兩個不同區塊的解。然而,這種情況發生的幾率是很低的。單區塊分叉每周都會發生,而雙塊分叉則非常罕見。

比特幣將區塊間隔設計為10分鍾,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。

E. 比特幣如何防止偽造交易記錄

(本文在觀看李永樂老師視頻講解基礎上整理)

防止偽造記錄是比特幣的一個重要特點,電子簽名技術就是防偽的關鍵。

當一個比特幣用戶注冊的時候會產生一個隨機數,隨之會產生一個私鑰,緊接著生成公鑰和地址。

接下來以「A轉給B十個比特幣」作為案例,看一下比特幣的交易是如何防偽的。

Step1:A編寫交易記錄並對信息加密

Step2:A將「交易信息、公鑰、地址」進行全網廣播

Step3:全網對A廣播出來的信息進行驗證

驗證的過程就是全網對廣播出來的交易信息進行哈希運算,並得出一個摘要。然後用廣播出來的公鑰和密碼進行解密,也得出一個摘要。

對這兩個摘要進行對比,如果相同,信息為真,如果不同,信息為假。

以上就是比特幣對信息驗證的過程。

結語

1、  比特幣防偽採取了電子簽名技術;

2、  私鑰加密,公鑰解密;

3、  對廣播出來的信息,全網會進行信息驗證,驗證通過代表信息真實,否則信息偽造。

參考文獻

[1]微博 @李永樂老師

F. 比特股的交易

比特股X認識到,當所有的交易數據都在使用同樣的腳本時,那麼保持腳本語言的靈活性是不必要的。

在比特幣的案例中,腳本語言的使用是受限的,因此我們無法使用比特幣的交易腳本來創建比特股X的交易宣告數據。

因此,定義了一套包含七種宣告條件的交易類型:

以簽名宣告

在交易數據輸出時,允許持有人簽名進行宣告。

這就跟標準的比特幣交易輸出腳本一樣。

以M分之N的簽名宣告

在交易數據輸出時,允許M位持有者當中的N位簽名進行宣告。

這就像是比特幣的多重簽名交易輸出。

以買單宣告

在特定的資產已經以指定的價位支付給買家之下,允許輸出執行支付。

一筆買單可以被部份達成,只要同時產生一個包含了變更的買單即可。

買單只能夠在新的區塊依照市場撮和演算法產生時,以其他的買單宣告、做多宣告、平倉宣告的交易輸出等明確的方式來進行撮和。

一項買單宣告的交易輸出也可以經由買家的簽名進行支付,此情形下買家可以取消掛單。

以做多宣告

當有人在某個價位做空 (以平倉宣告)時,允許此類交易輸出宣告。

空頭頭寸必須和另一個鑄造了等量的新BitUSD以簽名宣告的交易輸出相契合。

這種交易輸出也可以經由其持有者簽名進行支付,此情形下該持有者可以取消掛單。

以平倉宣告

允許從為空倉背書的抵押金中收取費用,該費用應與同一筆交易當中所銷毀的BitUSD成相應比例。

BitUSD的銷毀方式是將其包含在交易輸入數據中,但是不包含在交易輸出數據中達成的。

這筆交易輸出只能夠經由持有者補平,除非該輸出是被用於包含在掛單撮和演算法中作為追加保證金的一部分。

以期權執行宣告

在設定的日期之前,將期權買方將指定金額付給期權賣方的情況下,允許交易輸出進行支付。

在設定的日期之後,交易輸出只能由期權賣方來宣告。

以密碼宣告

用於跨鏈交易,在以下兩種情況下允許交易輸出執行支付: 提供兩組簽名或是一組簽名和一組密碼。

交易費用被設定為需支付的每位元組數據對應BTSX的價格。

簡譽伍單地說,交易費用即是市場執行訂單撮和演算法所收取的費用。

確切的交易費用根據每一筆掛單金額而有所變動。

關於具體的交易費用,我們計劃在比特股X已經運營一段時間並獲得一些歷史數據後再做公布。

要尋求更詳細的解釋請參見後面的「訂單撮和演算法」部分。

制定受託人銷毀比率以實現盈利

比特股X將比特股X視為一個分布式自治公司(DAC)並尋求盈利。

因此它應當為持股人賺取利潤。

盈利的實現,除了依靠股份市值的增長之外,還可以藉由制定銷毀比率來銷毀交易費用實現。

在經濟學角度上看,減少BTSX的供應量就如同將交易費用成比例以分紅的形式發給所有BTSX持股人。

雖比特股X會把用戶的BTSX的余額占總流通量的多寡按百分比進行顯示,因此會看到余額會隨著產塊的過程逐漸增加。

當用戶花費BTSX時,用戶界面在交易發生之前將顯示的佔百分比換算回真實的股份數量,然後再發送到區塊鏈上。

比特股X使用了非傳統的掛單撮和演算法。

傳統的掛單撮和演算法選擇提供給買家所要求的最少數量,有時會多一些,而比特股X的撮合演算法將總是提供給買家所要求恰好的數量。

如果出現最高買入價大於最低賣出價的情況時 – 其差額將會被系統收取為手續費。

在比特股X當中買家和賣家沒有本質的區別,因為一個用美元購入BTSX的人和用BTSX購入美元的人沒有分別。

雙方的交易都在各自指定的價位上成交,而非雙方使用了共同的價格。

其差額會被系統留存作為手續費。

比特股掛單撮和演算法

採用這種演算法的原因是為了懲罰那些想要製造大量掛單操縱單邊市場的人,因為在此演算法之下手續費的數目將會隨著掛單的數量成比例地增加。

這項設計是為了增強基於價值的投資而非純技術流的交易。

我們預期這將會減低市場波動性以及流動性,因為擾亂式的交易被移除了。

市場的參與者們對自燃源己的掛單能夠精準成交應該不會有抱怨,這樣一來大家只會理性地以他們認為合理的方式下單。

在開市並創建第一個比特資產之前,應該先以共識價格建立最小的市場深度。

相關的規則正在慶段或評估中,目前的設計是這樣的:

· 撮合所有的空單和多單 – 這將消除重疊掛單並建立一個初始的買/賣散布單。

· 核算參考價格 – 計算剩餘的最高買入價以及最低的賣出價得出平均值。

· 驗證+/-15%參考價格以內的市場深度 – 當買入以及賣出的量超過了最小臨界值,稱之為開放深度,交易將會被允許並正式開始。

藉由觸發市場需求或是買下所有掛單的行為可能會造成操縱市場攻擊並破壞市場的情況發生。

為此,當+/-15%參考價格以內的市場深度低於運行深度時,交易會中止。

如果價格在某交易回合中波動超過1%,那麼交易會暫停5分鍾。

這些保護措施避免了操縱市場造成的價格快速波動,並給交易者機會增加抵押品或是增加新掛單來穩定價格。

G. 比特幣系統規定要幾個個體確認後才算交易完成呢

6個區塊確認。

解釋:

A君給B君轉1個比特幣,除了要輸入交易金額1個比特幣外,還需要設置一定量的礦工費,在輸入秘鑰並點擊發送之後,需等待交易打包和6個區塊確認,才能完成這筆轉賬,而這個過程大概需要花費30分鍾~1小時。

比特幣網路上有很多節點,假設B和C節點在短時間差內都計算出工作量證明解,然後把自己挖到的區塊傳播到網路中,先傳播給鄰近節點,而後傳播到整個網路。

B和C礦工的區塊數據是不一樣的,但都是正確的,因此在這一刻出現了兩個都滿足要求的不同區塊,B和C附近進的D、E、F等等礦工在監聽到這個兩個區塊時,是有先後順序區別的。怎麼辦,先入為主,節點把先監聽的區塊復制過來,然後開啟新區塊的挖礦工作。

那這個時候不同節點,同時有不同版本的區塊鏈,而這兩個版本的區塊鏈,都被礦工們繼續開采。但是兩個版本的區塊鏈其增長速是不一樣的,總有一條鏈的長度要超過另一條鏈。當D、E、F等等礦工發現全網路中有一個條更長鏈的時候,他們會拋棄當前較短的鏈,轉到更長鏈上進行挖礦。而那些被礦工成功挖掘的塊,因為不是在最長鏈上而被拋棄了,他們叫過時塊。這些過時塊中的數據,又需要等待重新被寫入區塊中。

當一筆交易獲得6個區塊確認後,從而以確認該交易是在最長分支的區塊鏈里,不可篡改,然後才能夠花費小星轉他的比特幣。

(7)比特幣交易驗證解鎖腳本簽名擴展閱讀

比特幣交易確認過程

(1)錢包創建交易
錢包軟體通過收集UTXO、 提供正確的解鎖腳本、 構造支付給接收者的輸出這一系列的方式來創建交易。 產生的交易隨後將被發送到比特幣網路臨近的節點, 從而使得該交易能夠在整個比特幣網路中傳播。

(2)交易獨立效驗
每一個收到交易的比特幣節點將會首先驗證該交易,有效的交易將被傳遞到臨近的節點,這將確保只有有效的交易才會在網路中傳播, 而無效的交易將會在第一個節點處就被廢棄。
驗證的交易添加到交易地:驗證交易後, 比特幣節點會將這些交易添加到自己的交易池, 用來暫存尚未被加入到區塊的交易記錄。

(3)節點確認交易
假設有個比特幣網路節點A,其收集到了區塊277,314。接下來A節點做兩件事:1.嘗試挖掘新區塊;2.監聽其他節點是否挖出新的區塊。 如果A節點監聽到了區塊277315,則標志著277,315區塊競爭結束。與此同時開啟區塊277,316的競賽。

A節點在接收並驗證區塊277,315後,會檢查內存池中的全部交易, 移除已經在區塊277,315中出現過的交易記錄,確保任何留在內存池中的交易都是未確認的,等待被記錄到新區塊中,而被移除的交易記錄獲得一次確認交易。把包含在區塊內且被添加到區塊鏈上的交易稱為確認交易。

H. 『學概念找員外』門限密碼與多重簽名

密鑰分存還是有一個問題:密鑰分存之後,如果後面要用原密鑰來簽名,那就需要取得子密鑰,還原成原密鑰,然後才能簽名。這個過程有可能被黑客乘虛而入,盜取密鑰。

密碼學可以解決這個問題。如果子密鑰儲存在不同的設備中,可以以去中心化的方式還原原密鑰,而不是在某台設備上完成,這種技術叫門限簽名(threshold signature)技術。典型的例子就是使用雙重安全機制的電子錢包(N=2且K=2),如果兩個子密鑰分別保存在個人電腦和手機上,你可以在電腦上發起付款,這時,電腦會生成一個簽名片段,並發送到你的手機上,然後,手機會提示你付款信息(包括收款人、金額等),然後等待你確認。如果你確認了付款信息,這時,手機會利用它的子密鑰完成整個簽名,然後廣播到區塊鏈上。萬一黑客控制了你的電腦,試圖把比特幣轉到他的賬戶,你根據手機上的付款信息就知道有問題了,從而不會確認這筆交易。門限密碼涉及的數學細節比較復雜,員外也看不懂,所以就不展開討論了。

門限簽名是密碼學中的一項技術,將一個密鑰切分成不同片段,分別儲存,在交易簽名時無須還原原密鑰。而多重簽名是比特幣腳本的特性,把一個比特幣賬戶的控制權交給多個密鑰,這些密鑰共同保障賬戶安全。門限簽名和多重簽名都能克服密鑰單點保存的缺陷。

還有另外一種方法可以克服密鑰單點保存的缺陷,即多重簽名(multisignatures),這個名詞在第3章曾出現過。通過比特幣腳本,可以直接把一個比特幣賬戶的控制權交給多個密鑰,而不是將密鑰分存。這些密鑰可以保存在不同的地點,並分別生成簽名。當然,最終完成的交易的信息還是會保存在某台設備上,但即使黑客控制了這台設備,他所能做的也只不過阻止這個交易被廣播到整個網路上去。沒有其他設備參與,他無法生成出一個正當有效的多重簽名。

舉例來說,假設A、B、C、D、E是一家公司的創始人,這家公司有許多的比特幣。我們可能會用多重簽名來保護這些比特幣。這5個人,每人都有一對密鑰,我們可以用其中的3個簽名來保護冷儲存,一筆交易需要5個人中至少3個人的簽名才能完成。

這樣,只要我們5個人在不同地方且使用不同的安全措施保存各自的密鑰,那麼比特幣就會相當安全。黑客必須盜取我們當中3個人的密鑰,才能盜取比特幣。即便我們其中一個或兩個背棄了我們,他(們)也無法捲款而逃,因為他們還需要另一個簽名。同時,如果我們其中一個遺失了密鑰,其他人還是可以取出比特幣,並轉到新的賬戶,重新設置密碼。總而言之,多重簽名可以比較妥善地管理在冷儲存端的大額比特幣,任何重大事項都需要多人的參與才能實現。

上文中,我們說到,人們使用門限簽名技術的原因是為了實現雙重安全機制或多重安全機制,使用多重簽名技術的原因是為了實現多人對共同財產實現共同控制。實際上,這兩種技術都可以實現上述兩種目的。

I. 【區塊鏈】比特幣私鑰、公鑰、簽名

在 了解區塊鏈的基礎名詞概念 提到地址由字元和數字組成,但沒有說明怎樣產生的。銀行卡號由銀行核心系統生成,那比特幣地址是通過什麼生成的呢?看下圖:

對於剛接觸比特幣的小白來說,看到這張圖就蒙圈了,究竟什麼是私鑰、公鑰,為什麼生成個地址要這么麻煩嗎?

現在請大家記住這句話: 私鑰通過橢圓曲線相乘生成公鑰,使用公鑰不能導推出私鑰;公鑰通過哈希函數生成比特幣地址,地址也無法導推出公鑰

通過這么復雜演算法才算出地址,那私鑰和公鑰只是為了生成地址嗎?不是的,他們還有其他用途,我們先了解下私鑰和公鑰。

現在已經講解地址、挖礦、工作量證明、算力、區塊、區塊鏈等等的概念,不知大家還有印象嗎?如果忘記請溫習這些概念,因為後續很多地方都會用到這些概念。明天講解下區塊鏈有哪些特點。

參考書籍:《精通比特幣》
區塊鏈知識專題:

比特幣記賬方式(區塊鏈知識2)
了解塊鏈的基礎名詞概念(區塊鏈知識1)

J. 3、數字簽名(ECDSA)

比特幣中使用的數字簽名演算法是橢圓曲線數字簽名演算法(Elliptic Curve Digital Signature Algorithm)或ECDSA。 ECDSA是用於基於橢圓曲線私鑰/公鑰對的數字簽名的演算法,如橢圓曲線章節[elliptic_curve]所述。 ECDSA用於腳本函數OP_CHECKSIG,OP_CHECKSIGVERIFY,OP_CHECKMULTISIG和OP_CHECKMULTISIGVERIFY。每當你鎖定腳本中看到這些時,解鎖腳本都必須包含一個ECDSA簽名。

數字簽名在比特幣中有三種慎拿高用途:
● 第一,簽名證明私鑰的所有者,即資金所有者,已經授權支出這些資金。
● 第二,授權證明是不可否認的(不可否認性)。
● 第三,簽名證明交易(或交易的具體部分)在簽字之後沒有也不能被任何人修改。

創建數字簽名
在比特幣的ECDSA演算法的實現中,被簽名的「消息」是交易,或更確切地說是交易中特定數據子集的哈希值(參見簽名哈希類型(SIGHASH))。
簽名密鑰是用戶的私鑰,結果是簽名:
((Sig = F{sig}(F{hash}(m), dA)))
這里的:
● dA 是簽名私鑰
● m 是交易(或其部分)
● F hash 是散列函數
● F sig 是簽名演算法
● Sig 是結果簽名
ECDSA數學運算的更多細節可以在ECDSA Math章節中找到。
函數F sig 產生由兩個值組成的簽名Sig,通常稱寬尺為R和S:
Sig = (R, S)
簽名序列化(DER)
解鎖腳本序列化之後:
1301
包含敏嫌以下9個元素:
● 0x30表示DER序列的開始
● 0x45 - 序列的長度(69位元組)
● 0x02 - 一個整數值
● 0x21 - 整數的長度(33位元組)
● R-
● 0x02 - 接下來是一個整數
● 0x20 - 整數的長度(32位元組)
● S-
● 後綴(0x01)指示使用的哈希的類型(SIGHASH_ALL)

熱點內容
元宇宙vr概念股 發布:2025-07-08 02:52:23 瀏覽:701
元宇宙潛力游戲幣種 發布:2025-07-08 02:47:30 瀏覽:89
三大運營商區塊鏈本科 發布:2025-07-08 02:28:50 瀏覽:739
區塊鏈數字資產我國發行合法性 發布:2025-07-08 02:26:33 瀏覽:627
日本區塊鏈初創公司 發布:2025-07-08 02:26:23 瀏覽:440
中國區塊鏈方面發明專利公布 發布:2025-07-08 02:09:31 瀏覽:91
eth天價轉賬費無人申訴背後 發布:2025-07-08 02:02:42 瀏覽:713
五月八號doge 發布:2025-07-08 01:47:46 瀏覽:149
區塊鏈p2p聊天技術 發布:2025-07-08 01:44:37 瀏覽:710
以太坊15秒一個區塊 發布:2025-07-08 01:44:34 瀏覽:811