iT邦幫忙

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

區塊鏈報明牌系列 第 4

[區塊鏈報明牌]Day 4 比特幣論文(3)-Transactions, Timestamp Server

  • 分享至 

  • xImage
  •  

昨天發現把好多鏈打成練,自動選字亡我之心不死,還好亡羊補牢了。

Transactions

來延續Day3中提到的Transactions圖示:

修改一下昨天的code來演示其中的問題:

# -*- coding: utf-8 -*-
import ecdsa

'''
這裡用個簡單的結構當作一個transaction

transaction = {
    'owner_vk': # 該transaction擁有者的公鑰
    'data': # 先隨便放資料當作交易內容
    'signature': # 數位簽章
}

'''

owner0_sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
owner1_sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
owner1_vk = owner1_sk.get_verifying_key()
owner2_sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
owner2_vk = owner2_sk.get_verifying_key()
owner_other_sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
owner_other_vk = owner_other_sk.get_verifying_key()

# 第一個transaction
transaction1 = {
    'owner_vk': owner1_vk,
    'data': '隨便,先當作owner0給了owner1 1000萬,重點在於他是不是上個owner同意後簽名的內容',
    'signature': owner0_sk.sign('假設中的transaction0' + owner1_vk.to_pem())
}

# 上一個transaction的擁有者同意交易的內容後簽章證明
# 因為當前owner的公鑰也在裡面
# 所以當前owner要基於這次的交易結果去跟別人進行下一次交易的時候
# 就可以證明這個transaction是他的
def trade(pre_tran, data, pre_sk, now_vk):
    
    transaction = {
        'owner_vk': now_vk,
        'data': data,
        'signature': pre_sk.sign(str(pre_tran) + now_vk.to_pem())
    }      

    # 交易談好了
    # 現在確認上一個transaction的擁有者有沒有偷改他以前的交易內容
    try:
        pre_tran['owner_vk'].verify(transaction['signature'], str(pre_tran) + now_vk.to_pem())
        return transaction
    except:
        print('有騙子?!')

        
# owner1 跟 owner2 談好交易了
# 也確認owner1之前的transaction是他的也沒被竄改     
transaction2 = trade(transaction1, '1000萬拿去收好', owner1_sk, owner2_vk)

# owner1 把給同一筆交易內容也拿去給別人做新交易 可是沒有被發現!!!!
transaction_other = trade(transaction1, '同一個1000萬拿去收好', owner1_sk, owner_other_vk)

github放有完整的範例程式提供,可以直接執行參考。

讓我們想想常見的電子交易中是如何避免類似狀況的呢?情況又會回到我們在Day1所提到的需要有一個讓交易雙方都能信任的代理來執行啦。

到這裡可能有人會覺得奇怪,既然這篇論文一直強調要避免第三方代理,那怎麼會有銀行或政府之類的機構會去投資區塊鏈技術呢?要知道雖然講了幾天的比特幣論文,但重點並不是講比特幣,而是背後的區塊鏈技術,重點在於用密碼學技術提供安全基礎跟分散式系統達成共識的前提下實現一些具有去中心化、去信任化性質的交易、合約流程,像是Day1的例子中政府可以藉由理想的虛擬貨幣免去貨幣管理中的大量人力成本跟人為疏失,並在技術上做修正達到能進行一定程度監督與收稅的方案。銀行同理也可以去替換內部一些原本需要大量人力和繁瑣手續才能確保信任程度的流程,所謂的第三方代理也不一定是某個大型機構,也可以是某些運作流程中的員工。

言歸正傳,那麼在中本聰的原始論文中如何解決重複交易這個問題呢?

Timestamp Server

在該論文中要在沒有第三方代理的情況下,確保沒有重複交易的重點到目前有兩個,一個就是把交易昭告天下,讓全部用該系統交易的人都知道你們做了這個交易,另一個就是在交易中附上timestamp,同時timestamp也會被進行hash,因為前面每個時間點的交易都會被加入hash,整個交易的順序就可以被追蹤了,比特幣的timestamp是使用UNIX時間。

看到這裡應該很多人還是覺得很怪,就算可以追蹤交易的歷史了,把交易昭告天下是怎樣個昭告法?之後就會看到了。

下圖為比特幣論文Timestamp Server章節的示意圖,可以看到這裡的說明圖示已經從transaction變成了區塊(block),每個block中會有很多個transaction,圖示中的區塊(block)還是一個一個連在一起的,終於要說到區塊鏈了嗎?更詳細的說明留到之後解釋,今天先到這啦。

相關參考資源:

《Bitcoin: A Peer-to-Peer Electronic Cash System》
https://bitcoin.org/bitcoin.pdf
timestamp
https://medium.com/all-things-ledger/decoding-the-enigma-of-bitcoin-mining-f8b2697bc4e2


上一篇
[區塊鏈報明牌]Day 3 比特幣論文(2)-數位簽章
下一篇
[區塊鏈報明牌]Day 5 比特幣論文(4)-鏈起區塊
系列文
區塊鏈報明牌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言