iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
1
自我挑戰組

區塊鏈報明牌系列 第 9

[區塊鏈報明牌]Day 9 比特幣論文(8)-來點誘因挖個礦

昨天提到了挖礦,其實會看到這天的人我想大部分都知道挖礦的大致含意,今天就來讓報明牌鏈能自己生出幣吧。

先說一下從今天開始的比特幣論文內容很多部份跟區塊鏈的本質已經沒有直接關西了,更多是考慮比特幣如何實務運作,主要包括給予掌握多數算力的節點足夠的利益以及改善區塊鏈效能讓實際運作更加可行。

就我自己目前的認知,區塊鏈最核心的價值只有兩個,利用密碼學技術製作無法竄改的交易流程以及在分散式系統中讓每個節點達成共識維護同一份交易流程,其他會在新聞中常見的名詞很多都只是針對某種場景或應用針對性進行使用的,當然寬鬆點來看也能說是區塊鏈技術、觀念,但並非必要的性質。

Incentive

假設正常人都是理性且貪婪的,算了還是別假設,似乎這種看似簡單的問題往往都最難解,總之中本聰在論文中設計了兩種誘因。

一個是給予算出合法區塊者直接獎勵,又俗稱挖礦,論文中還真的是這樣比喻的:

The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation.

在真實的比特幣實作中是讓挖礦獎勵每隔一段時間減半,最後變成零,最後就剩下處理交易的手續費作為獎勵了,不過論文並沒有規定獎勵要一段時間減半所以比特幣總量不變這類的實作問題。

中本聰最後提到如果惡意攻擊者真的掌握足夠發動攻擊的算力,將會發現選擇維護比特幣會更加有利可圖,我只能說從比特幣發行至今的確如此,不過惡意攻擊真的有在其他小規模的虛擬貨幣中發生過,想了想還是別多做評論。不知道大家有沒有聽過賽局理論(game theory)呢?這個理論是在冷戰美蘇對峙的時期蓬勃發展,美蘇間的對立關西很好理解,實際行為卻難以回答。個人認為虛擬貨幣中的誘因問題也是如此,很好理解、難以回答,就不多做評論了。

挖礦

首先把創世區塊(Genesis block)中之前預設的錢拿掉,從現在開始報明牌鏈就靠產生合法區塊來發錢:

'''
中本聰在比特幣的創世區塊中塞了這一段話,來表達他對當時金融危機狀況的不滿:
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
https://en.bitcoin.it/wiki/Genesis_block

為了致敬一下,在報明牌鏈的創世區塊pre_hash中把它塞進去,反正創世區塊前面也沒有區塊要對應。
'''

Genesis_block = {
    'prev_Hash': 'The Times 03/Jan/2009 Chancellor on brink of second bailout for banks',
    'nonce': '',
    'timestamp': 0, 
    'Txs': [ # 一個block裡面會有很多個transaction紀錄
    ] 
}


實際產生合法區塊時,先塞一筆沒有in只有out的交易產生區塊的挖礦獎勵:


# 判斷交易是不是挖礦獎勵就看他是不是區塊中的第一筆交易
# 因為報明牌鏈目前實作上都是一收到交易就馬上產生合法區塊(挖礦)
# 現在每挖一個區塊 挖礦者就擁有100個報明牌幣
def create_block(self):
    # 挖礦收益的私鑰
    sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)   
    # 把私鑰給當前的節點留著
    # 實務上不會是print這種粗糙手法
    print("請把您的私鑰收好,挖到礦就有錢了: %s" % sk.to_pem())
    # 對應的公鑰 
    vk = sk2.get_verifying_key()

    block = {
        'prev_Hash': None,
        'nonce': None,
        'timestamp': int(time.time()), 
        'Txs': [
             {
                    'owner_vk': vk.to_pem(),
                    'preowner_vk': '',
                    'data': 100,
                    'signature': ''
             }
    
        ]
    }
     
    self.proof_of_work(block)

只要挖礦就有錢了嗎!?那其他都不管了拼命挖!?


def mainloop( self ):

.......

while not self.shutdown:
    try:
        # 把挖礦計算直接塞進loop!
        create_block()
        ....

.......

實際演示


node = BTPeer(0, 4444)
node.addpeer(1, 'xxx.xxx.xxx.xxx', 4444)
node.addpeer(2, 'xxx.xxx.xxx.xxx', 4445)
node.addpeer(3, 'xxx.xxx.xxx.xxx', 4446)

node.mainloop()

'''
請把您的私鑰收好,挖到礦就有錢了: -----BEGIN EC PRIVATE KEY-----
......
-----END EC PRIVATE KEY-----

挖礦賺錢囉!
xxx.xxx.xxx.xxx:4444 計算合法區塊成功
node xxx.xxx.xxx.xxx:4444:紀錄了新block中的所有交易
......
-----END EC PRIVATE KEY-----

挖礦賺錢囉!
xxx.xxx.xxx.xxx:4444 計算合法區塊成功
......

github放有完整的範例程式提供,可以直接執行參考,可以把debug設成1以方便理解流程。

比特幣中錢從何而來的部份解決啦,可是現在每個節點都不收交易了都只會挖礦!昨天的網路流程第二點不是才說要把交易放到區塊裡嗎?

畢竟現在收交易好像沒有好處,反正算到合法區塊就能賺錢了。其實是Incentive這章還沒講完,還有手續費的部份,因為我還在研究比特幣實際實作中如何處理手續費才合理,所以就留到明天啦。

最後還是要在強調一下,除了每篇文中介紹的觀念方法,這裡的很多程式處理手法主要是為了DEMO方便展示(當然還有為了趕進度的寫法/images/emoticon/emoticon13.gif)所以並不嚴謹,或是論文中目前還沒有提及到該部份如何實做,雖然都符合中本聰到目前為止在論文中的定義,但實際的比特幣運作遠比這要複雜的多。當然最主要的重點是今天一開始提及的區塊鏈技術的核心價值,以及了解比特幣設計方法背後的思想。

相關參考資源:

《Bitcoin: A Peer-to-Peer Electronic Cash System》
https://bitcoin.org/bitcoin.pdf


上一篇
[區塊鏈報明牌]Day 8 比特幣論文(7)-網路流程 & 硬分叉
下一篇
[區塊鏈報明牌]Day 10 比特幣論文(9)-要從此路過 留下買路財
系列文
區塊鏈報明牌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言