免費(fèi)網(wǎng)站推廣軟文發(fā)布中國國家數(shù)據(jù)統(tǒng)計(jì)網(wǎng)
區(qū)塊鏈技術(shù)與應(yīng)用
數(shù)組
列表
二叉樹
哈希函數(shù)
BTC中的密碼學(xué)原理
cryptographic hash function
- collsion resistance(碰撞抵抗)
碰撞指的是找到兩個不同的輸入值,使得它們的哈希值相同。也就是說,如果存在任意兩個輸入x和y,滿足x ≠ y,但哈希函數(shù)計(jì)算后得到的哈希值H(x) = H(y),那么就存在一個碰撞。
碰撞抗性的原理在于,對于一個安全的哈希函數(shù),找到一個碰撞是非常困難的。也就是說,計(jì)算出一個碰撞的時(shí)間和計(jì)算哈希函數(shù)的時(shí)間相比要非常長。這種困難性是基于哈希函數(shù)的設(shè)計(jì)和理論假設(shè),例如散列算法的復(fù)雜性、數(shù)學(xué)難題或者密碼學(xué)的安全假設(shè)。
- hiding
哈希函數(shù)的計(jì)算過程是單向的,不可逆的。但前提要滿足輸入控件足夠大,且分布均勻。通常我們在實(shí)際操作中會使用添加隨機(jī)數(shù)的方法。假設(shè)給定一個輸入值X,可以算出哈希值H(x),但是不能從H(x)推出X。
- puzzle friendly(只能暴力碰撞)
通常我們限定輸出的哈希值在一定范圍內(nèi),即H(block header + nonce) < target (block header是區(qū)塊鏈的鏈頭),這個確定鏈頭范圍的過程即為挖礦
BTC用的HASH函數(shù)SHA-256(Secure Hash Algorithm)
BTC簡單流程
區(qū)塊頭(Block Header):每個區(qū)塊都有一個區(qū)塊頭,它包含了一些重要的信息,如前一個區(qū)塊的哈希值、交易信息、時(shí)間戳等。在挖礦中,挖礦節(jié)點(diǎn)會對區(qū)塊頭進(jìn)行計(jì)算,以尋找符合特定條件的哈希值。
目標(biāo)值(Target):目標(biāo)值是一個用于控制挖礦難度的參數(shù)。它通常表示為一個固定長度的二進(jìn)制數(shù),在挖礦過程中被用來限定哈希值的范圍。挖礦節(jié)點(diǎn)的目標(biāo)是找到一個符合要求的哈希值,使得該哈希值小于目標(biāo)值。
哈希值計(jì)算:挖礦節(jié)點(diǎn)會將區(qū)塊頭與一個隨機(jī)的值(稱為nonce)進(jìn)行組合,然后通過哈希函數(shù)對組合后的數(shù)據(jù)進(jìn)行計(jì)算,得到一個哈希值。該哈希值應(yīng)該是不可預(yù)測且隨機(jī)的。
比較與驗(yàn)證:計(jì)算得到的哈希值與目標(biāo)值進(jìn)行比較。如果哈希值小于目標(biāo)值,則該區(qū)塊被認(rèn)為是有效的。挖礦節(jié)點(diǎn)將這個有效的區(qū)塊廣播給網(wǎng)絡(luò)中的其他節(jié)點(diǎn),并將其添加到區(qū)塊鏈上。
難度調(diào)整:為了保持挖礦的平均時(shí)間間隔,比特幣等一些區(qū)塊鏈系統(tǒng)會根據(jù)全網(wǎng)的算力情況動態(tài)調(diào)整目標(biāo)值。如果全網(wǎng)的算力上升,目標(biāo)值將會降低,以增加挖礦難度;如果全網(wǎng)的算力下降,目標(biāo)值將會提高,以降低挖礦難度。
密碼學(xué)運(yùn)用
公鑰加密和簽名:比特幣賬戶使用公鑰加密和簽名算法,如橢圓曲線數(shù)字簽名算法(ECDSA)。在創(chuàng)建賬戶時(shí),會生成一對密鑰:公鑰和私鑰。
公鑰用于生成賬戶地址,私鑰用于對交易進(jìn)行簽名以驗(yàn)證身份和授權(quán)交易。
助記詞和種子短語:助記詞(seed phrase)是一串由單詞組成的短語,它是通過密碼學(xué)安全的算法從隨機(jī)數(shù)生成的種子短語(seed phrase)。助記詞用于備份和恢復(fù)比特幣錢包,保證了即使設(shè)備丟失或損壞,仍能夠恢復(fù)錢包和資金。
隨機(jī)性和密鑰生成:比特幣賬戶的密鑰對是通過密碼學(xué)安全的隨機(jī)數(shù)生成算法生成的。安全的隨機(jī)數(shù)是在密碼學(xué)中至關(guān)重要的,確保密鑰的隨機(jī)性和不可預(yù)測性,以保護(hù)賬戶的安全性。
防篡改的區(qū)塊鏈:比特幣使用密碼學(xué)中的哈希指針和區(qū)塊鏈技術(shù),確保賬戶和交易的不可篡改性。區(qū)塊鏈的每個區(qū)塊都包含了前一個區(qū)塊的哈希值,通過這種鏈接方式,保證了賬戶余額和交易歷史的可驗(yàn)證性和不可篡改性。
區(qū)塊1
-------
| |
| 哈希 |
| |
-------
| 上一個區(qū)塊的哈希 |
-------------------
| 時(shí)間戳 |
-------------------
| 數(shù)據(jù) |
-------------------區(qū)塊2
-------
| |
| 哈希 |
| |
-------
| 上一個區(qū)塊的哈希 |
-------------------
| 時(shí)間戳 |
-------------------
| 數(shù)據(jù) |
-------------------區(qū)塊3
-------
| |
| 哈希 |
| |
-------
| 上一個區(qū)塊的哈希 |
-------------------
| 時(shí)間戳 |
-------------------
| 數(shù)據(jù) |
-------------------
BTC的數(shù)據(jù)結(jié)構(gòu)
區(qū)塊鏈
用hash指針代替了普通指針
Block(區(qū)塊)
比特幣的區(qū)塊是由多個交易組成的數(shù)據(jù)結(jié)構(gòu)。
區(qū)塊的哈希計(jì)算方法
-
獲取區(qū)塊頭數(shù)據(jù):區(qū)塊的哈希值是基于區(qū)塊頭(Block Header)計(jì)算的。區(qū)塊頭包含了一些重要的信息,包括前一個區(qū)塊的哈希、交易信息、時(shí)間戳等。
-
拼接數(shù)據(jù):將區(qū)塊頭中的各個字段按照特定的順序拼接在一起。
通常的拼接順序是:版本號、前一個區(qū)塊的哈希、默克爾根(Merkle Root)、時(shí)間戳、難度目標(biāo)和隨機(jī)數(shù)(Nonce)。
-
哈希計(jì)算:對拼接后的數(shù)據(jù)應(yīng)用SHA-256哈希函數(shù)進(jìn)行計(jì)算。
計(jì)算結(jié)果是一個256位的二進(jìn)制數(shù),通常以十六進(jìn)制表示。
-
驗(yàn)證難度目標(biāo):將計(jì)算得到的哈希值與當(dāng)前區(qū)塊鏈的難度目標(biāo)進(jìn)行比較。難度目標(biāo)是一個固定長度的二進(jìn)制數(shù),用于控制挖礦的難度。哈希值必須小于難度目標(biāo)才能滿足挖礦的要求。
-
重復(fù)過程:如果計(jì)算得到的哈希值不滿足難度目標(biāo),需要調(diào)整區(qū)塊的隨機(jī)數(shù)(Nonce),再次進(jìn)行哈希計(jì)算。這個過程稱為挖礦,旨在尋找符合要求的哈希值。
-
區(qū)塊的哈希值:一旦找到滿足要求的哈希值,這個哈希值將成為該區(qū)塊的標(biāo)識,稱為區(qū)塊的哈希值。
Merkle Tree(默克爾樹)是一種樹狀的數(shù)據(jù)結(jié)構(gòu),用于有效地驗(yàn)證大量數(shù)據(jù)的完整性。它在區(qū)塊鏈和其他分布式系統(tǒng)中廣泛使用。
Root Hash (Merkle Root)/ \Hash A Hash B/ \ / \Hash 1 Hash 2 Hash 3 Hash 4
通過默克爾根可以快速驗(yàn)證交易是否被篡改。同時(shí),在區(qū)塊鏈中,默克爾樹還用于優(yōu)化存儲和同步數(shù)據(jù)的過程,提高網(wǎng)絡(luò)效率。
Merkle proof
->驗(yàn)證數(shù)據(jù)交易的可信鏈
proof of membership->Merkle proof
proof of membership->Sorted Merkle Tree
class CBlockHeader
{
public:// headerint32_t nVersion; // 當(dāng)前使用的比特幣版本,不可更改uint256 hashPrevBlock; // 前一個區(qū)塊的Hash,不可更改uint256 hashMerkleRoot; // MerkleTree的根Hashuint32_t nTime; // 時(shí)間戳,因?yàn)楸忍貛啪W(wǎng)絡(luò)不要求絕對的時(shí)間同步,所以這個值可以小范圍的調(diào)整uint32_t nBits; // 目標(biāo)閾值,根據(jù)協(xié)議定期調(diào)整uint32_t nNonce; // 隨機(jī)數(shù)......
}
BTC協(xié)議
去中心化貨幣需要解決的兩個問題:
-
數(shù)字貨幣的發(fā)行
-
怎么驗(yàn)證
它的解決方案是
- 比特幣的發(fā)行是由挖礦決定的
- 依靠區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)
比特幣的發(fā)行者 A 擁有鑄幣權(quán)(create coin),假如發(fā)行 10 個比特幣,A(10) 分別給 B 和 C 各五個bitcoin → B(5) C(5),該交易需要有 A 的簽名,證明經(jīng) A 同意(signed by A)。同時(shí)還要說明花掉的10個比特幣從哪來的。我們可以看到第二個方框中 A 的錢是從第一個框內(nèi)鑄幣交易中來的。
比特幣系統(tǒng)中每個交易都包含輸入和輸出兩部分。輸入部分要說明幣的來源,輸出部分要給出收款人公鑰的哈希。
有的交易部分比較復(fù)雜,如 C 的貨幣來源是第二、第三個方框的交易,要標(biāo)識清楚。
上圖就構(gòu)成了一個小型的區(qū)塊鏈,這里有兩種哈希指針,一種哈希指針是連接在各個區(qū)塊之間的,把它們串起來構(gòu)成一個鏈表,前面學(xué)的就是這種哈希指針。而在該圖中還有第二種哈希指針,是指向前面某個交易的指針,用來指明幣的來源。
double speeding attack
為什么要說明幣的來源?:證明幣不是憑空捏造的,是有記錄的,同時(shí)也是為了防范雙花攻擊(double spending attack)
現(xiàn)在來看第二個方框里 A 向 B 的轉(zhuǎn)賬,該交易需要 A 的簽名和 B 的地址。比特幣系統(tǒng)里收款的地址是通過公鑰推算出來的。比如 B 的地址就是 B 的公鑰取哈希,然后經(jīng)過一些轉(zhuǎn)換得到的。
A 如何知道 B 的地址呢?比特幣系統(tǒng)中沒有查詢對方地址的功能,必須通過其他渠道。比如某個電商網(wǎng)站,接受比特幣支付,就可以公開它的地址或公鑰
那如何才能知道 A 的公鑰?實(shí)際上交易里就包含了。輸入時(shí)不僅要輸入幣的來源,還要輸入公鑰。那這就存在了安全漏洞,假如 B 的同伙偽造了這次交易呢?其實(shí)第一個方框里鑄幣交易的輸出就有 A 的公鑰的哈希,所以第二個方框交易里 A 的公鑰要跟前面哈希對的上
上圖是對交易系統(tǒng)進(jìn)行的簡化,實(shí)際上每個區(qū)塊(對應(yīng)圖中的每個方框)可以有很多交易,這些交易組成默克爾樹(merkle tree)。每個區(qū)塊分為塊頭(block header)和塊身(block header)。
區(qū)塊
塊頭(block header)
塊頭是一個固定長度的數(shù)據(jù)結(jié)構(gòu),包含了關(guān)于區(qū)塊的元信息。
- 版本號(Version):表示該區(qū)塊的版本。
- 上一個區(qū)塊的哈希(Previous Block Hash):指向上一個區(qū)塊的哈希值,用于鏈接區(qū)塊鏈中的前后關(guān)系。(Hash of previous block header)
- Merkle 樹根哈希(Merkle Root Hash):是一個哈希值,用于校驗(yàn)區(qū)塊中所有交易的完整性。
- 時(shí)間戳(Timestamp):記錄了區(qū)塊的生成時(shí)間。
- 難度目標(biāo)(Difficulty Target):表示該區(qū)塊的工作量證明難度目標(biāo)。->挖礦的難度值
- 隨機(jī)數(shù)(Nonce):用于工作量證明的計(jì)算。
Block Body
Merkle Root Hash->保證交易完整性
交易列表(Transaction List):這是一個包含多個交易的列表,每個交易記錄了參與者之間的資產(chǎn)轉(zhuǎn)移和交易細(xì)節(jié),如發(fā)送方、接收方、金額等。這些交易構(gòu)成了區(qū)塊鏈上的賬本數(shù)據(jù)。
交易(Transaction): 比特幣的交易是指貨幣或其他資產(chǎn)的轉(zhuǎn)移記錄。每個交易都包含以下關(guān)鍵信息:
- 輸入(Inputs):指明要使用的先前交易的輸出,以及用于證明擁有這些輸出的數(shù)字簽名。
- 輸出(Outputs):指明將資產(chǎn)發(fā)送給的目標(biāo)地址及其相應(yīng)金額。
- 鎖定腳本(Locking Script):用于驗(yàn)證發(fā)送者擁有先前交易輸出的數(shù)字簽名。
- 解鎖腳本(Unlocking Script):包含發(fā)送者提供的數(shù)字簽名和其他必要信息,以驗(yàn)證交易的有效性。
full node(全節(jié)點(diǎn))->fully validating node保存Block Header和Block Body
light node(手機(jī)或者邊緣節(jié)點(diǎn)只保存block header)
系統(tǒng)的賬本要取得分布式的共識
分布式的哈希表
distributed hash table
分布式系統(tǒng)的不可能結(jié)論
FLP impossiblity result
FLP(Fischer-Lynch-Paterson)不可能性結(jié)果是分布式計(jì)算中的一個基本結(jié)果,它表明在在asynchronous(異步)網(wǎng)絡(luò)中,即使只有一個進(jìn)程崩潰,也不存在能夠容忍的確定性共識算法。
在異步網(wǎng)絡(luò)中,無法區(qū)分一個已崩潰的進(jìn)程和一個需要任意長時(shí)間才能響應(yīng)的進(jìn)程。這種不確定性導(dǎo)致了在這種系統(tǒng)中實(shí)現(xiàn)一致性的不可能性。
CAP theorem
Consistency(一致性) ->Paxos
Availability
Partition torlerance
分布式數(shù)據(jù)系統(tǒng)無法同時(shí)提供三個保證:一致性(Consistency)、可用性(Availability)和分區(qū)容錯性(Partition Tolerance)。
比特幣中的共識協(xié)議
工作量證明(Proof of Work,PoW):PoW是比特幣最早采用的共識機(jī)制。它要求節(jié)點(diǎn)通過解決一道復(fù)雜的數(shù)學(xué)難題(稱為挖礦)來證明自己的工作量,并獲得記賬權(quán)。具有最大計(jì)算能力的節(jié)點(diǎn)有更高的概率獲得記賬權(quán),但需要大量的計(jì)算能力和能源消耗。
分叉攻擊(forking attack)
最長合法鏈
攻擊方法
長度分叉攻擊:攻擊者試圖創(chuàng)建一個比網(wǎng)絡(luò)上其他節(jié)點(diǎn)更長的區(qū)塊鏈分支,以取代原始的區(qū)塊鏈。攻擊者可能通過控制網(wǎng)絡(luò)節(jié)點(diǎn)、延遲區(qū)塊傳播或者通過其他手段來構(gòu)造一個具有更長鏈的分支,從而使其他節(jié)點(diǎn)接受這個分支并放棄原有的區(qū)塊鏈。
比特幣系統(tǒng)的實(shí)現(xiàn)
比特幣是基于交易的賬本模式(transaction-based ledger)
UTXO
UTXO全名是Unspent Transaction Outputs,未花費(fèi)交易輸出,它的總體的設(shè)計(jì)是基于這樣一種思路,如果A要花費(fèi)一筆錢比如100元,這筆錢不會憑空產(chǎn)生,那么必然由B先花費(fèi)了100元,被A賺到這100元,然后A才能繼續(xù)花費(fèi)這一筆錢。這個鏈條的源頭就是先產(chǎn)生這筆錢,在比特幣中這被稱為鑄幣(coinbase)。然后會產(chǎn)生這樣一個鏈條,鑄幣->B->A->? 整個過程從鑄幣開始,一直可以追溯到當(dāng)前的狀態(tài),當(dāng)接收到一個UTXO輸入的時(shí)候,可以基于這個模型判斷這筆錢有沒有被在別的地方花費(fèi)過。
手續(xù)費(fèi)和初塊獎勵(每隔21萬個區(qū)塊獎勵減半)
account based ledger->以太坊
挖礦過程的解釋
每次挖礦過程就是一次Bernoulli trail
a random experiment with binary outcome
每次試nouce求解,構(gòu)成了Bernoulli process(無記憶性)
a sequence of independent Bernoulli trait
實(shí)驗(yàn)次數(shù)很多,每次實(shí)驗(yàn)成功率很低->Poisson process
progress free->挖礦公平性保證
比特幣總量
Bitcoin is secured by mining
問題:假設(shè)大部分算力掌握在誠實(shí)的節(jié)點(diǎn)手里,可否保證所有寫入?yún)^(qū)塊的交易都是合法的?
(記賬權(quán))
攻擊成功的標(biāo)志是誠實(shí)的節(jié)點(diǎn)接受惡意節(jié)點(diǎn)的需求
雙花攻擊的防范,6 confirmation
區(qū)塊鏈?zhǔn)莍rrevocable ledger,但這種不可篡改性只是概率上的保證,剛寫入Block的交易是容易篡改的
selfish Mining 分叉攻擊(減少競爭)
比特幣網(wǎng)絡(luò)工作原理
The BitCoin Network
Application layer(應(yīng)用層):運(yùn)行Bitcoin block chain
network layer(底層):運(yùn)行p2p overlay network(節(jié)點(diǎn)通信)
比特幣的網(wǎng)絡(luò)設(shè)計(jì)原則:simple robust but not efficient
每個節(jié)點(diǎn)都要維護(hù)一個等待上鏈放入交易的集合
轉(zhuǎn)發(fā)交易->flooding(洪泛)
如果同時(shí)接受到兩個交易
商家如何防范先后不成功(無法及時(shí)支付)
區(qū)塊鏈的挖礦難度的調(diào)整
SHA256
H(block header)<=target
挖礦難度太小的問題?
分叉會容易出現(xiàn),而且不止二分叉,分叉過多對達(dá)成共識沒有好處,回危害系統(tǒng)的安全性(分散算力)
ETH——>出塊速度15秒
分支協(xié)議Ghost協(xié)議中orphan block不能簡單丟棄而是由uncle reward
如何調(diào)整挖礦難度?
每隔2016個區(qū)塊(約兩周)調(diào)整一次目標(biāo)閾值
t a r g e t = t a r g e t ? a c t u a l t i m e ( 系統(tǒng)產(chǎn)生2016實(shí)際花費(fèi)的時(shí)間) e x p e c t e d t i m e ( 產(chǎn)生 2016 區(qū)塊預(yù)估的時(shí)間 ) target=target*\frac{actual\space time(\text{系統(tǒng)產(chǎn)生2016實(shí)際花費(fèi)的時(shí)間)}}{expected\space time(產(chǎn)生2016區(qū)塊預(yù)估的時(shí)間)} target=target?expected?time(產(chǎn)生2016區(qū)塊預(yù)估的時(shí)間)actual?time(系統(tǒng)產(chǎn)生2016實(shí)際花費(fèi)的時(shí)間)?
比特幣算力的變化
比特幣挖礦
挖礦設(shè)備
第一代:CPU
第二代:GPU
第三代:ASIC(Application Specific Intergreted circuit)
要找到nouce,使得其hash值前多少位為0符合要求,礦主只要規(guī)定找到nouce使得其hash前60位為0即可獲得1個share,最后真挖到BTC后,用share來分享收益
假設(shè)礦池掌握51%的算力,具體可以發(fā)動的攻擊?
1.forking attack
礦池可以在不被檢測到的情況下將一筆交易的貨幣發(fā)送到接收方,并且同時(shí)將相同的貨幣發(fā)送到自己的地址。因?yàn)榈V池?fù)碛薪^大部分的算力,所以它們可以更快地產(chǎn)生一個替代鏈,使得這筆雙重支付的交易在整個網(wǎng)絡(luò)上被確認(rèn)。
礦池可以通過先產(chǎn)生一個較長的替代區(qū)塊鏈,然后將其與當(dāng)前區(qū)塊鏈進(jìn)行替換,從而抹去之前確認(rèn)的交易和塊。這可以用來逆轉(zhuǎn)交易或雙重支付。
2.Boycott
3.盜幣->不大可能
礦池可以選擇不在新的區(qū)塊中包含特定的交易,從而阻止交易的確認(rèn)。
比特幣腳本語言
基于棧的語言
模式一 P2PK(Pay to Public Key)
input script:
PUSHDATA(Sig)
output script:
PUSHDATA(PubKey)
CHECKSIG
簽名腳本(Signature Script): 用于驗(yàn)證你是否擁有私鑰的腳本。在比特幣交易中,你需要提供一個簽名,以證明你有權(quán)使用公鑰對應(yīng)的私鑰進(jìn)行交易。
PUSHDATA(Sig): 將簽名數(shù)據(jù)(Signature)推送到棧頂
# 這個指令用于將簽名數(shù)據(jù)推送到腳本執(zhí)行環(huán)境的棧頂,以便后續(xù)操作使用。
# 簽名數(shù)據(jù)是用發(fā)送方的私鑰對交易數(shù)據(jù)進(jìn)行簽名得到的,用于證明該交易的合法性和真實(shí)性。PUSHDATA(PubKey): 將公鑰(Public Key)推送到棧頂
# 這個指令用于將接收方的公鑰推送到腳本執(zhí)行環(huán)境的棧頂,以便后續(xù)操作使用。
# 公鑰是比特幣地址背后的關(guān)鍵組成部分,用于驗(yàn)證由發(fā)送方的私鑰簽名的交易。CHECKSIG: 驗(yàn)證簽名
# 這個指令用于從棧頂獲取簽名數(shù)據(jù)和公鑰,并驗(yàn)證簽名的有效性。
# 它首先從棧頂彈出公鑰和簽名數(shù)據(jù),然后使用公鑰驗(yàn)證簽名是否與交易數(shù)據(jù)匹配,
# 如果驗(yàn)證成功,則交易被認(rèn)為是有效的,可以被添加到區(qū)塊鏈上;否則,交易會被拒絕。
模式二 P2PKH(Pay to Public Key Hash)
input script:
PUSHDATA(Sig)
PUSHDATA(PubKey)output script:
DUP
HASH160
PUSHDATA(PubKeyHASH)
EQUALVERIFY
CHECKSIG
執(zhí)行腳本
PUSHDATA(Sig): 將簽名數(shù)據(jù)(Signature)推送到棧頂
# 這個指令用于將簽名數(shù)據(jù)推送到腳本執(zhí)行環(huán)境的棧頂,以便后續(xù)操作使用。
# 簽名數(shù)據(jù)是用發(fā)送方的私鑰對交易數(shù)據(jù)進(jìn)行簽名得到的,用于證明該交易的合法性和真實(shí)性。PUSHDATA(PubKey): 將公鑰(Public Key)推送到棧頂
# 這個指令用于將接收方的公鑰推送到腳本執(zhí)行環(huán)境的棧頂,以便后續(xù)操作使用。DUP: 復(fù)制棧頂元素
# 這個指令用于復(fù)制棧頂元素,即復(fù)制公鑰。HASH160: 對棧頂元素彈出進(jìn)行哈希
# 這個指令用于對棧頂?shù)墓€執(zhí)行哈希操作,得到哈希160值,壓入棧PUSHDATA(PubKeyHash): 將公鑰哈希(Public Key Hash)值推送到棧頂
# 這個指令用于將接收方的公鑰哈希值推送到腳本執(zhí)行環(huán)境的棧頂,以便后續(xù)操作使用。
# 公鑰哈希是由接收方的公鑰經(jīng)過哈希函數(shù)(如SHA-256和RIPEMD-160)得到的,它是比特幣地址的一部分。# EQUALVERIFY: 比較并驗(yàn)證棧頂?shù)膬蓚€元素是否相等
# 這個指令用于比較棧頂?shù)膬蓚€元素(發(fā)送方提供的公鑰哈希和輸出腳本中推送的公鑰哈希)是否相等。
# 如果不相等,交易將被認(rèn)為無效,腳本的執(zhí)行將終止。# CHECKSIG: 驗(yàn)證簽名
# 這個指令用于從棧頂獲取簽名數(shù)據(jù)和公鑰,并驗(yàn)證簽名是否與交易數(shù)據(jù)匹配,
# 如果驗(yàn)證成功,則交易被認(rèn)為是有效的,可以被添加到區(qū)塊鏈上;否則,交易會被拒絕。
模式三 P2SH(Pay to Script Key Hash)
采用BIP16的方案
輸入腳本 (Input Script):
# PUSHDATA(Signature1)
# PUSHDATA(Signature2)
# ... (可能有多個簽名數(shù)據(jù),根據(jù)多重簽名的情況)# PUSHDATA(serialized RedeemScript)
輸出腳本 (Output Script):
redeem是贖回
# HASH160: 對棧頂元素(即RedeemScript)進(jìn)行哈希
# 這個指令用于對棧頂?shù)腞edeemScript執(zhí)行哈希操作,得到哈希160值。# PUSHDATA( RedeemScriptHash): 將腳本哈希(Script Hash)推送到棧頂
# 這個指令用于將腳本哈希值推送到腳本執(zhí)行環(huán)境的棧頂。
# 腳本哈希是由RedeemScript經(jīng)過哈希函數(shù)(如SHA-256和RIPEMD-160)得到的。# EQUAL: 比較棧頂?shù)膬蓚€元素是否相等
# 這個指令用于比較棧頂?shù)膬蓚€元素(發(fā)送方提供的腳本哈希和輸出腳本中推送的腳本哈希)是否相等。
# 如果不相等,交易將被認(rèn)為無效,腳本的執(zhí)行將終止。
redeemScript的形式
- P2PK形式
- P2PKH形式
- 多重簽名形式
用P2SH實(shí)現(xiàn)P2PK
執(zhí)行腳本
第一階段
FALSE(應(yīng)對bitcoin已有的Bug)
第二階段
反序列化并展開執(zhí)行贖回腳本
PUSHDATA(PubKey)
CHECKSIG
Proof of Burn
AltCoin(Alterbative Coin)需要銷毀bitcoin
區(qū)塊鏈永久保存
digital commitment
(coinbase只能由有記賬權(quán)的節(jié)點(diǎn))
比特幣分叉
fork
-
state fork(對比特幣狀態(tài)產(chǎn)生分歧)
- forking attack(deliberate fork)
-
protocol fork(因?yàn)锽TC協(xié)議產(chǎn)生分歧而造成的分叉)
- hard fork
硬分叉是一種比較徹底的協(xié)議更新方式。當(dāng)區(qū)塊鏈的規(guī)則發(fā)生重大改變時(shí),以至于舊版本的節(jié)點(diǎn)無法與新版本節(jié)點(diǎn)共享交易和區(qū)塊數(shù)據(jù)時(shí),就會發(fā)生硬分叉。在硬分叉發(fā)生后,區(qū)塊鏈將被分為兩個不兼容的分支,形成兩個獨(dú)立的區(qū)塊鏈網(wǎng)絡(luò)。
- soft fork
軟分叉是一種相對較小的協(xié)議更新方式。當(dāng)區(qū)塊鏈的規(guī)則進(jìn)行較小的更改,以至于新版本節(jié)點(diǎn)產(chǎn)生的區(qū)塊和交易仍然可以被舊版本節(jié)點(diǎn)接受和處理時(shí),就會發(fā)生軟分叉。新版本節(jié)點(diǎn)產(chǎn)生的區(qū)塊在舊版本節(jié)點(diǎn)看來仍然是有效的,因此整個網(wǎng)絡(luò)仍然保持一致。
- 舊版本節(jié)點(diǎn)可以繼續(xù)與新版本節(jié)點(diǎn)共享交易和區(qū)塊數(shù)據(jù),因?yàn)樾乱?guī)則是對舊規(guī)則的一種擴(kuò)展。
- 不需要全網(wǎng)節(jié)點(diǎn)的升級支持,因?yàn)榕f版本節(jié)點(diǎn)可以繼續(xù)驗(yàn)證新版本節(jié)點(diǎn)產(chǎn)生的區(qū)塊。
- 但是,如果大部分網(wǎng)絡(luò)節(jié)點(diǎn)不升級,新規(guī)則將無法得到充分利用,因此為了實(shí)現(xiàn)軟分叉的目的,大多數(shù)礦工和節(jié)點(diǎn)最好還是升級到新版本。
修改coinbase中域的內(nèi)容
每個區(qū)塊中都包含一個鑄幣交易,在該交易中包含一個coinbase域。在比特幣交易中,這個域是不做檢測的,這意味著可以在這個域中隨意寫入。在《數(shù)據(jù)結(jié)構(gòu)》章節(jié)中介紹MerkleTree時(shí)講過,MerkleTree任意葉子節(jié)點(diǎn)的修改都會影響到MerkleTree的根Hash值。因此,當(dāng)block header中的4個字節(jié)的nonce不夠用的時(shí)候,可以使用其它字節(jié),比如將coinbase域的前8個字節(jié)當(dāng)做extra-nonce來使用,這樣搜素空間就擴(kuò)展到了 2 96 2^{96} 296。
軟分叉著名例子:P2SH
redeem Script
小結(jié)
Q1:轉(zhuǎn)賬交易的時(shí)候如果接受者不在線怎么辦
A:只需要接受者的公鑰,不需要接受在線
Q2:私鑰丟失如何處理?
A:丟了就沒了,死錢,有交易所的話,就會由交易所保管,類似
Q3:轉(zhuǎn)賬寫錯地址怎么辦?
A:沒辦法取消交易,轉(zhuǎn)到不存在的地址,也沒有辦法追回
Q4:既然所有寫入?yún)^(qū)塊的交易都需要被驗(yàn)證正確性,那為什么proof of ban中的OP_RETURN(無條件遇到錯誤)會被區(qū)塊接受
A:對于某個交易,我們需要驗(yàn)證當(dāng)前交易的輸入腳本和之前交易的輸出腳本,而OP_RETURN是寫在當(dāng)前交易的輸出腳本的,因此本次驗(yàn)證不會被檢查到(或者執(zhí)行到)
Q5:如何防范別的礦工偷取nouce
A:在coinbase tx中,是有收款人地址,若想偷取nouce,需更改地址,會導(dǎo)致Merkle Tree發(fā)生改變,從而Root hash改變,從而block header 發(fā)生改變,nouce也不一樣了(作廢了)
比特幣的匿名性
Bitcoin and anonymity->privacy
pseudonymity(假名)
可能破壞比特幣匿名性的幾個方法
(一)即便一筆交易生成多個inputs和outputs,這些交易也有可能被人為關(guān)聯(lián)
inputs: addr 1(4 BTC) addr 2(5 BTC) addr1&addr2一般認(rèn)為是一個人
outputs: addr 3(6 BTC) addr 4(3 BTC) 可以分析出addr4是找零錢地址
(二)地址賬戶和現(xiàn)實(shí)世界的真實(shí)身份也可能產(chǎn)生關(guān)聯(lián)
地址關(guān)聯(lián):當(dāng)用戶在不同交易中使用相同的比特幣地址時(shí),可能會暴露其交易行為和資金流動。如果有人能夠識別特定地址的所有者,那么該用戶的交易歷史和資金流動就能被跟蹤。
比特幣的用戶在其他社交媒體或網(wǎng)站上透露了與其比特幣地址相關(guān)的信息,從而將其交易與身份聯(lián)系起來。
防范比特幣洗錢:盯住資金的轉(zhuǎn)入轉(zhuǎn)出鏈
(三)公開交易數(shù)據(jù):比特幣的交易歷史是公開的,所有交易都被記錄在區(qū)塊鏈上,每個人都可以查看。雖然交易中的參與者不一定是公開的身份,但一旦有人能夠?qū)⒌刂放c特定的個人或?qū)嶓w聯(lián)系起來,他們就可以對該用戶的交易進(jìn)行分析和跟蹤。
(四)IP地址泄露:在進(jìn)行比特幣交易時(shí),用戶通常需要通過與比特幣網(wǎng)絡(luò)連接的節(jié)點(diǎn)進(jìn)行通信。如果用戶的IP地址被暴露,他們的交易活動可能會被跟蹤和分析。
如何提高匿名性
hide your identity from real world
- 每次使用新的地址
- 使用比特幣混幣服務(wù)
- 使用匿名網(wǎng)絡(luò)連接(虛擬私人網(wǎng)絡(luò)或者洋蔥網(wǎng)絡(luò))
- 使用CoinJoin:CoinJoin是一種隱私協(xié)議,多個用戶將交易混合在一起,使得交易更加復(fù)雜,難以追蹤。
零知識證明
零知識證明是指一方(證明者)向另一方(驗(yàn)證者)證明一個稱述的正確性,而無需透露與該事實(shí)相關(guān)的詳細(xì)信息用于驗(yàn)證某種陳述的真實(shí)性,同時(shí)不透露關(guān)于該陳述的任何其他信息。這種證明方法允許一個主體(證明者)向另一個主體(驗(yàn)證者)證明某個事實(shí)的正確性,
同態(tài)隱藏
- 如果 x , y x, y x,y 不同, 那么它們的加密函數(shù)值 E ( x ) E(x) E(x) 和 E ( y ) E(y) E(y) 也不相同。
- 給定 E ( x ) E(x) E(x) 的值, 很難反推出 x x x的值。
- 給定 E ( x ) E(x) E(x) 和 E ( y ) E(y) E(y) 的值, 我們可以很容易地計(jì)算出某些關(guān)于 x , y x, y x,y 的加密函數(shù)值。
- 同態(tài)加法: 通過 E ( x ) E(x) E(x) 和 E ( y ) E(y) E(y) 計(jì)算出 E ( x + y ) E(x+y) E(x+y) 的值
- 同態(tài)乘法: 通過 E ( x ) E(x) E(x) 和 E ( y ) E(y) E(y) 計(jì)算出 E ( x y ) E(x y) E(xy) 的值
- 一擴(kuò)展到多項(xiàng)式
例子:Alice想要向Bob證明她知道一組數(shù)x和y使得x+y=7,同時(shí)不讓Bob知道x和y的具體數(shù)值。
- Alice把E(x)和E(y)的數(shù)值發(fā)給Bob
- Bob通過收到的E(x)和E(y)計(jì)算出E(x+y)的值(利用了性質(zhì)3)
- Bob同時(shí)計(jì)算E(7)的值,如果E(x+y)=E(7),那么驗(yàn)證通過,否則驗(yàn)證失敗。
盲簽方法
- 用戶A提供SerialNum(暗文),銀行在不知道SerialNum的情況下返回簽名Token,減少A的存款
- 用戶A把SerialNum(明文)和Token交給B完成交易
- 用戶B拿SerialNum(明文)和Token給銀行(銀行不知道幣的來源)驗(yàn)證,銀行驗(yàn)證通過,增加B的存款
- 銀行無法把A和B聯(lián)系起來。
- 中心化
盲簽名(Blind Signature)是密碼學(xué)中的一種重要概念,是數(shù)字簽名和盲化技術(shù)的結(jié)合。它允許用戶在不暴露明文消息內(nèi)容的情況下,向簽名方請求簽名,從而保護(hù)消息的隱私性。
盲簽名的過程可以簡要概括為以下步驟:
- 盲化(Blinding):消息的發(fā)送者(通常被稱為用戶)使用一個隨機(jī)數(shù)(盲化因子)對消息進(jìn)行盲化操作,產(chǎn)生一個盲化消息。盲化是一種對消息進(jìn)行變換的操作,使得簽名方不能直接得知原始消息。
- 簽名請求:用戶將盲化后的消息發(fā)送給簽名方(通常被稱為簽名者)請求簽名。由于消息已被盲化,簽名者無法得知實(shí)際消息內(nèi)容。
- 盲化解除:簽名者對接收到的盲化消息進(jìn)行簽名,生成簽名值,但簽名者并不知道實(shí)際的消息內(nèi)容。
- 盲化因子消除:用戶通過對簽名值進(jìn)行反盲化操作,使用盲化因子取消盲化,得到簽名后的實(shí)際簽名值。
最終,用戶獲得了有效的簽名,而簽名者對消息的內(nèi)容一無所知。這就是盲簽名的核心原理,它確保了消息的隱私性,同時(shí)又提供了簽名的有效性。
零幣和零鈔
- 零幣和零鈔在協(xié)議層就融合了匿名化處理,其匿名屬性來自密碼學(xué)保證。
- 零幣(zerocoin)系統(tǒng)中存在基礎(chǔ)幣和零幣,通過基礎(chǔ)幣和零幣的來回轉(zhuǎn)換,消除舊地址和新地址的關(guān)聯(lián)性,其原理類似于混幣服務(wù)。
- 零鈔(zerocash)系統(tǒng)使用zk-SNARKs協(xié)議,不依賴一種基礎(chǔ)幣,區(qū)塊鏈中只記錄交易的存在性和礦工用來驗(yàn)證系統(tǒng)正常運(yùn)行所需要關(guān)
鍵屬性的證明。區(qū)塊鏈上既不顯示交易地址也不顯示交易金額,所有交易通過零知識驗(yàn)證的方式進(jìn)行。
比特幣引發(fā)的思考
Hash Pointer 指針只是形象的說法,實(shí)際系統(tǒng)只有hash沒有指針
/** Nodes collect new transactions into a block, hash them into a hash tree,* and scan through nonce values to make the block's hash satisfy proof-of-work* requirements. When they solve the proof-of-work, they broadcast the block* to everyone and the block is added to the block chain. The first transaction* in the block is a special one that creates a new coin owned by the creator* of the block.*/
class CBlockHeader
{
public:// headerint32_t nVersion;uint256 hashPrevBlock;uint256 hashMerkleRoot;uint32_t nTime;uint32_t nBits;uint32_t nNonce;
(key,value)->levelDB
區(qū)塊戀
把私鑰分成兩份,表示感情
注意
截?cái)嗨借€的方法會降低安全性,而要用多重簽名的方法
三、分布式公式
為什么比特幣系統(tǒng)能夠繞過分布式共識中的不可能結(jié)論?
比特幣并沒有取得嚴(yán)格意義的共識:如分叉
四、比特幣稀缺性
五、量子計(jì)算
參考文獻(xiàn)
bitcoin/src at master · bitcoin/bitcoin (github.com)
https://www.bilibili.com/video/BV1Vt411X7JF?p=1