Bitcoin原理與實作
錢包
錢包裡面含有多個Bitcoin Address以及公私鑰
錢包加密 source code: https://github.com/bitcoin/bitcoin/blob/af563971fcbece3659f501329afa9dc84ed733b2/src/wallet/crypter.cpp
https://en.bitcoin.it/wiki/Wallet_encryption
產生公鑰和私鑰與比特幣地址

以下使用node.js實作
先安裝npm install bs58
base58說明:https://zh.wikipedia.org/wiki/Base58
Genesis block
也稱為創世區塊,為區塊鏈在一開始產生時的區塊
比特幣的: https://blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
其擁有以下結構
bitcoin genesis 創建的原始碼 https://github.com/bitcoin/bitcoin/blob/3955c3940eff83518c186facfec6f50545b5aab5/src/chainparams.cpp#L123
Merkle tree
區塊鏈中的每個區塊都包含了產生於該區塊的所有交易,且以Merkle樹表示

他是把每一筆資料的txid用兩次sha256做加密
然後再把兩個字串連結再一起,之後再繼續做一樣的加密,直到出現Merkel根為止
ex:
挖礦
在挖礦過程中成功“挖出”新區塊的礦工可以得到該區塊中包含的所有交易手續費。目前,這筆費用占礦工收入的0.5%或更少,大部分收益仍來自挖礦所得的比特幣獎勵
可以先參考此網站 http://www.yogh.io/#mine:last
他會用區塊頭
來做兩次sha256加密,只要比一個target數小,及為挖到新的區塊
礦工挖礦的獎勵為區塊第一筆交易,通常被稱為coinbase,它沒有輸入,所以TxIn的Hash總是被標記為00000000...0000

你可能會想說為什麼不直接給小於某一個數字就好了為何還要慢慢算呢,因為算出來後要給別人驗證你已經算出來的話你必須給別人本文,也就是加密前的東西,讓別人用你的本文加密,來確認真的可以用這個本文算出特定hash
可能會有兩個節點同時算出區塊,這時兩個區塊會廣播自己算出的區塊給鄰近節點,此時會產生兩個分支,這時下一個算出區塊的分支會再次廣播他算出的區塊,而另一個分支接收到後會發現有其他更長的分支,就會拋棄原先的分支來繼續算目前最長分支的下一個區塊
廣播與驗證交易
https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages
發出交易後發出者會帶上用私鑰與相關交易訊息hash過的值,而發出的script包含公鑰,之後其他節點要驗證交易時就用這個公鑰看能不能解開即可
意思為用發出者的公鑰解開他用私鑰加密後的東西即為交易本文
(即為ECDSA的verify過程)
發出的交易經過六個確認(納入六個區塊後)金額才可繼續被交易
主要是避免Double spend(發出同樣的交易兩次)
難度difficulty的更改
https://en.bitcoin.it/wiki/Difficulty
難度在每2016個block被挖出後會自動按照公式更改一次
Hash Rate
也可以用以下網站來估計
先到https://blockchain.info/charts/hash-rate 查看現在平均的算力
然後填入,他就會幫你計算相關數據

從TXid hash找出某筆交易詳細訊息
會有一個HASH表,所以用很短的時間複雜度即可從hash對應到直接的資訊,也因為這些txid的hash之後會在兩兩加密為merkel tree 並將merkel root 存在block中,所以就算可以看到資訊也不怕被修改,具有hash通常都有hash table可以查到它裡面對應的值
新加入節點如何找到其他節點
利用寫在原始碼的DNS seed
The DNS seedsare maintained by Bitcoin community members
Nodesare added to the DNS seedif they run on the default Bitcoin ports of 8333 for mainnetor 18333 for testnet.
https://github.com/bitcoin/bitcoin/blob/aab1e55860dea1e40fc02bc0e535c1d1474a5ae3/src/chainparams.cpp 124行
其他回答可參考http://bitcoin.stackexchange.com/questions/3536/how-do-bitcoin-clients-find-each-other
使用nslookup來查看提供的url會回覆一串IP address

Last updated
Was this helpful?