Bitcoin原理與實作

錢包

錢包裡面含有多個Bitcoin Address以及公私鑰

錢包加密 source code: https://github.com/bitcoin/bitcoin/blob/af563971fcbece3659f501329afa9dc84ed733b2/src/wallet/crypter.cpparrow-up-right

https://en.bitcoin.it/wiki/Wallet_encryptionarrow-up-right

產生公鑰和私鑰與比特幣地址

以下使用node.js實作 先安裝npm install bs58

base58說明:https://zh.wikipedia.org/wiki/Base58arrow-up-right

Genesis block

也稱為創世區塊,為區塊鏈在一開始產生時的區塊

比特幣的: https://blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26farrow-up-right

其擁有以下結構

bitcoin genesis 創建的原始碼 https://github.com/bitcoin/bitcoin/blob/3955c3940eff83518c186facfec6f50545b5aab5/src/chainparams.cpp#L123arrow-up-right

Merkle tree

區塊鏈中的每個區塊都包含了產生於該區塊的所有交易,且以Merkle樹表示

他是把每一筆資料的txid用兩次sha256做加密

然後再把兩個字串連結再一起,之後再繼續做一樣的加密,直到出現Merkel根為止

ex:

挖礦

在挖礦過程中成功“挖出”新區塊的礦工可以得到該區塊中包含的所有交易手續費。目前,這筆費用占礦工收入的0.5%或更少,大部分收益仍來自挖礦所得的比特幣獎勵

可以先參考此網站 http://www.yogh.io/#mine:lastarrow-up-right

他會用區塊頭

來做兩次sha256加密,只要比一個target數小,及為挖到新的區塊

礦工挖礦的獎勵為區塊第一筆交易,通常被稱為coinbase,它沒有輸入,所以TxIn的Hash總是被標記為00000000...0000

你可能會想說為什麼不直接給小於某一個數字就好了為何還要慢慢算呢,因為算出來後要給別人驗證你已經算出來的話你必須給別人本文,也就是加密前的東西,讓別人用你的本文加密,來確認真的可以用這個本文算出特定hash

可能會有兩個節點同時算出區塊,這時兩個區塊會廣播自己算出的區塊給鄰近節點,此時會產生兩個分支,這時下一個算出區塊的分支會再次廣播他算出的區塊,而另一個分支接收到後會發現有其他更長的分支,就會拋棄原先的分支來繼續算目前最長分支的下一個區塊

https://en.bitcoin.it/wiki/Confirmationarrow-up-right

廣播與驗證交易

https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messagesarrow-up-right

發出交易後發出者會帶上用私鑰與相關交易訊息hash過的值,而發出的script包含公鑰,之後其他節點要驗證交易時就用這個公鑰看能不能解開即可

意思為用發出者的公鑰解開他用私鑰加密後的東西即為交易本文

(即為ECDSA的verify過程)

發出的交易經過六個確認(納入六個區塊後)金額才可繼續被交易

主要是避免Double spend(發出同樣的交易兩次)

難度difficulty的更改

https://en.bitcoin.it/wiki/Difficultyarrow-up-right

難度在每2016個block被挖出後會自動按照公式更改一次

Hash Rate

也可以用以下網站來估計

http://bitcoin.web-share.nl/arrow-up-right

先到https://blockchain.info/charts/hash-ratearrow-up-right 查看現在平均的算力

然後填入,他就會幫你計算相關數據

從TXid hash找出某筆交易詳細訊息

會有一個HASH表,所以用很短的時間複雜度即可從hash對應到直接的資訊,也因為這些txid的hash之後會在兩兩加密為merkel tree 並將merkel root 存在block中,所以就算可以看到資訊也不怕被修改,具有hash通常都有hash table可以查到它裡面對應的值

新加入節點如何找到其他節點

利用寫在原始碼的DNS seed

The DNS seedsarrow-up-rightare maintained by Bitcoin community members

Nodesarrow-up-rightare added to the DNS seedarrow-up-rightif they run on the default Bitcoin ports of 8333 for mainnetarrow-up-rightor 18333 for testnetarrow-up-right.

https://github.com/bitcoin/bitcoin/blob/aab1e55860dea1e40fc02bc0e535c1d1474a5ae3/src/chainparams.cpparrow-up-right 124行

其他回答可參考http://bitcoin.stackexchange.com/questions/3536/how-do-bitcoin-clients-find-each-otherarrow-up-right

使用nslookup來查看提供的url會回覆一串IP address

Last updated