2018年1月5日 星期五

Bitcoin摘要

在Green climber's home吃飯的時候聊到了bitcoin,之前雖然常有耳聞,但是一直沒有真正去了解
回來之後查了wiki的條目和看了一支影片之後做了一些整理



一個共享的貨幣最需要解決的兩個問題就是同步性跟避免重複花錢的問題。

blockchain

bitcoin使用的blockchain的機制建立的。
block chain是一個持續成長的紀帳表(Ledger),每一筆bitcoin的交易都記錄在這個共享的記帳表當中。每有一筆新的交易,交易者就會將交易的內容廣播給附近的所有人(但是使用者不一定要接收,一般只有礦工會接收這些未成block的交易)。當交易達到一定的數量,會由礦工將一個區段的所有交易提交成一個block之後廣播給所有人(所有人都會接收這種訊息) ,被提交到block的交易才會真正生效。

blockchain是以非集中管理(分散式)的方式來記錄所有bitcoin的交易紀錄,也就是說,不像刷卡一樣有一個銀行再認證每筆交易,bitcoin的交易是以大眾的力量來認證。但bitcoin要怎麼知道一個block有通過大眾的認可呢?主要的手段就是藉由加密的複雜性來完成,因為每個block都需要完成一種特別需要消耗資源的加密過程,而單一攻擊者的運算速度很難與剩餘誠實者的運算速度匹敵,因此運算的速度較快的誠實大眾加密速度比攻擊者快。
在結構上,每個block有一個指標指向上一個block,而這個指標也會被列入加密驗證的一環,因此無法隨意更改。一但更改其中一部份,後面所有的block都需要重新計算,因此block是環環相扣,無法抽換其中任何一個block。

記帳本上面記錄的是X將Y個bitcoins轉移給Z這種交易(transection)資訊

加密

彼特必用到很多層的加密技術
1. 每筆交易的加密
雖然交易是公開資訊,但是需要透過一種簽名機制是大家都能辨識者筆交易的確出自於該bitcoin擁有者之手,但又不需要知道擁有者的私人資訊。這個加密與驗證必須足夠簡單,但又足夠安全。驗證者需要在不得之擁有者的私鑰下,以公鑰驗證交易內容字串是否有被竄改過,非常精巧。
2. 每個block的加密
當資料量累積成block(1MB)後就會對block進行交易,當然,每組礦工所認知的block一定是不一樣的,端看他們接收/選擇了那些交易去組合。而這個block的頭就是一個指向上一個block的指標,身體是交易的內容,最後是一組pow(proof of work)來證實這組block有被大量計算過。pow的做法大概就是在block後面加一串字串,使得這個block產生的加密碼符合特定規則,ex經過sha256加密之後前n bit是0(這是一個暴力且沒有解析解的運算)。

挖礦
基本上,挖礦就是在認證bitcoin的交易。一組交易要有效就要看它是否有被放入block中。而礦工可以從中拿到比特壁的系統獎金和內涵的交易手續費。系統獎金的部分是在bitcoin創立時就決定的,每開發完成一個block就可以拿到一定數量的bitcoin(由礦工自行加在block中,如果block成功被延續,這筆交易就能合法存在)。另外,交易為了能夠被收到block中,交易者可以自主支付交易手續費,增加交易被放入block中的機會。

交易
因為認證的機制,一組交易基本上大概過6分鐘才能首次被收入block中,一個block在有6個子代之後才比較能說是穩定,因此bitcoin的交易並不即時。且這個速度會因為交易附載量與你交易支付的手續費有相關,且不保證支付的手續費與完成速度之間的關聯性。

後面是一些我在看資料的筆記,未經整理

每個bicoin address(address幾乎無限)有一組鑰匙,公鑰跟私鑰。用私鑰將要傳送到Ledger的訊息加密(數位簽名),加密後的訊息要可以通過公鑰的認證。這個訊息除了該次交易的對象跟金額以外還需要包含一個獨特的ID,以確認該交易的獨特性。訊息建構完成之後會廣撥給所有的nodes。

但要如何確認每個人都拿到同一份ledger?bitcoin的做法就是確認這份ledger有受到最多的work投入。

hash function 將任意數量的input變成指定數量的output。
很小的input改變會造成很大的output變換。bitcoin用的是SHA256。output為256bit。
挖礦做的事情就是在一個block加上一些數字,讓這個block hash出來的結果前面有數個bit是0。基本上一個任意數值經過SHA256之後前面N位為0的機率是2^N。因為SHA256的不可逆性,只能用暴力的方式猜這個值。而且一但猜到了,只要隨意更動ledger裡面的一小部分,整個過程就需要重做,否則hash的結果就會不符合規定。這個值就是proof of work。算出這個block的人可以在block上加上一筆特殊的交易 block creator 1 gets XXX

另外為了保護每block之間的相對關係,每個block的header會包含上一個block hash的結果,也就是說只要前面有任何更動,後面的header hash驗算就可以發現。這就是block chain的由來。

對於純粹使用者來說,就只需要去聽block created的廣播。Miner才需要去聽交易的廣播,並組合成block。當接到兩種不同的block chain廣播的時候,nodes會選擇比較長的block chain,意味著投入了比較多的努力(computation power的chain)。從相信central authority變為相信computational work。

譬如說A只向B發送他給B 100BTC,意思就是他騙了B。這時候他要比其他的miner更快算出新的block,並只發給B。但因為B還會從其他Miner收聽新的Block,因此A會需要持續算出新的Block,並且算得比其他Miner都快,讓他fork出去的list一直維持在最常的狀態。因此要作弊的話會需要有一個比其他Miner都多,也就是51%的computation power。這也就是為什麼不要相信你所收到的第一個block,而要等著他後面被接上數個block。

每小時約有6個block被建立並發布給所有的節點。每個block的size約是1MB,約2400個交易。這個交易量的限制造成BTC的交易手續費較高,約為0.0013 BTC

一個節點在後面有更多節點被建立之後會變得更加的不可逆,因為後面的節點都會用到這個節點的結果。也就是說,修改了這個節點,後面全部的節點也都會需要被修改

一項交易發布之後需要等待一段時間來"被確認",平均來說是十分鐘。因為miner在建立block的時候可以選擇要包含的交易,一般來說越是有付傭金的交易越容易被選到,也更快能夠被confirm。一筆交易如果提交了3天來沒被confirm,該筆交易就會被取消,該bitcoin回到user手中可以再被花用。

一筆交易的手續費依交易的大小而定,而跟交易所涉及的BTC數量無關,也就是說一筆0.1BTC的交易可能需要付比100BTC的交易更高的手續費。到底該付多少手續費,電子錢包可以幫你計算(但這沒有標準答案)。手續費跟大小有關,而輸入的大小是5x於輸出的大,也就是說要是你要支付6BTC,將10BTC分割為6BTC+4BTC會比將1+5BTC合成為6BTC划算。手續費也跟網路上存在的其他交易有關,如果有很多手續費高的交易存在,就可能需要支付更高的手續費來完成交易。完成交易的時間是不固定的,使用者要避免期待在未來的一小時之內需要知道交易結果。



基本是miner做的事情就是計算出符合需求複雜度的hash code,因為這個計算沒有解析解,只能一個個數字暴力代入求解,直到找到符合要求的解答之後就可以將他所計算的block連接到整個block chain上。當然,有發生同時有兩個miner計算出合法的block接在目前block後面的可能,這時候就要看哪個block的後面有更多人去接,更快計算出結果,另一邊的chain就會變成幽靈。mining的難度會依投入的總計算力調整,每2016個blocks(約14天)調整一次。

挖礦的人可以得到的好處有兩部分,其一是他所包含進block的所有交易的手續費;二是系統給的發現新block的獎金。所以miner會盡量包含含有較高fee的block,系統給的獎金就是bitcoin慢慢擴充的來源(使用者們所同意的通貨膨脹,目前是12.5BTC),每四年會減半(210,000個blocks),目前bitcoin的總量是16M,最多會增加到21M,到時候挖礦的獎勵就只會剩下手續費。

bitcoin的地址是設計來for一次性使用的

proof of work
在跟server要服務的時候,server會先出一道題目給client算。這個題目要是不容易算,但是容易驗證答案的,這樣可以避免client濫發request去癱瘓server。而且因為題目是由server提供,server可以根據目前的附載調整題目的難度

將一個block的所有交易轉換為一個hash code會用到Merkle Tree。基本上就是把兩組交易的hash結果接起來,當成下一次hash的input,最後就會產生一個單一的hash結果

沒有留言:

張貼留言