Bitcoin比特幣的優秀設計詳解

說說比特幣用到的一些精妙的設計:

1、UTXO模型。正常人去設計一個貨幣系統,通常會用帳號系統,也就是一個帳號對應一個餘額。爲了方便介紹,下面給交易的數據結構。

class COutPoint
{
public:
    uint256 hash; //上一個交易的hash
    uint32_t n;   //hash對應的這個交易的vout的index
}
class CTxIn
{
public:
    COutPoint prevout; //這個輸入使用的那個交易的輸出
    CScript scriptSig; //簽名
    uint32_t nSequence;
    CScriptWitness scriptWitness; // 隔離見證的簽名
}
class CTxOut
{
public:
    CAmount nValue;
    CScript scriptPubKey; //輸出鎖定腳本
}
class CTransaction
{
public:
    const std::vector<CTxIn> vin; // vin.size() >= 1
    const std::vector<CTxOut> vout; // vout.size() >= 1
    const int32_t nVersion;
    const uint32_t nLockTime;
}

CTxOut代表一筆轉賬,有金額和鎖定腳本。鎖定腳本有好幾種,這裏可以簡單的認爲是支付到某個比特幣地址,誰能提供這個地址對應的簽名就能創建一個交易,並用它作爲輸入把轉到任意的輸出。一個UTXO有點類似現實中的一個硬幣,只不過UTXO有任意的面值(正確是大於粉塵值且小於比特幣上限)。好處是易於跟蹤,當然也是它的缺點,不具匿名性。另外一個優點是鎖定腳本多樣性。

2、區塊頭。區塊和區塊體分開,方便同步傳輸。

class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;
}
class CBlock : public CBlockHeader
{
public:
    std::vector<CTransactionRef> vtx;
}

區塊的主要數據在交易,區塊頭的數據只佔80字節。區塊頭的hash包含算力驗證,僅依據區塊頭就能判斷是否數據合法、根據算力選擇最長鏈,進而決定是否要下對應區塊數據(具體的交易)。區塊頭數據小,即便傳輸幾千個區塊頭,也能在很短時間內完成。

3、BlockChain。區塊通過字段hashPrevBlock鏈接起來,形成鏈狀,hashPrevBlock指向前一個區塊。鏈越長,累加的算力越大,要想篡改也就越難。

4、MerkleTree。區塊頭並沒有包含具體交易的數據,它是如何保證交易數據不被修改?是的,就是hashMerkleRoot這個字段。它是交易數組vtx中所有交易的hash,相鄰兩兩再hash,得到新的數組,對這個新數組重複前面操作,直到只剩一個值。有興趣的可以看 https://www.cnblogs.com/fengzhiwu/p/5524324.html

5、CoinBase交易。既然一筆交易需要包含輸入輸出,那第一筆交易的輸入哪裏來?比特幣規定,礦工可以在區塊中構造一個沒有輸入的交易,輸出的值等於區塊獎勵+區塊其他交易的手續費(輸入減輸出的差值爲手續費),並且放在vtx數組的第一個位置。CoinBase交易的輸出需要滿足100個高度才能使用。

6、pow。挖礦共識Proof of work。礦工那麼多,誰作爲話事人呢?畢竟挖到區塊有筆不菲的收入。pow共識就是爲了確定礦工而產生的。誰能最快提供一個區塊,它的hash值小於目標值,這個區塊就是他的。hash值目前只能依靠硬碰,不斷的修改nNonce的值去償試。目標值會不斷調整,當算力增時,出塊時間變快了,目標值爲了控制出塊時間間隔在10分鐘左右,目標值變小。用區塊的方式還可以解決雙花的問題。

7、區塊鏈公理:一切依賴經濟懲罰的共識都是垃圾。比特幣的優點是利用數學保證區塊鏈數據正確。有些區塊鏈往往爲了區塊安全加入經濟懲罰機制,這洽洽導致區塊不安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章