1. 程式人生 > >最簡單的區塊鏈實現,不到50行程式碼!(一)

最簡單的區塊鏈實現,不到50行程式碼!(一)

什麼是區塊鏈(Blockchain)?
一個電子記賬本,以比特幣和其他密碼加密貨幣進行的交易公開地、按照日期順序記錄其中。

總的來說,它是一個公開的資料庫,新的資料儲存在一個稱為區塊的容器中,並且附加到一個“不可變”的鏈條(即區塊鏈)上,鏈條上還有以前附加的資料。這裡的“不可變”指的是以前的資料一旦附加到鏈條上,後面是不可更改的。所以說白了,區塊鏈就是一個特殊的歷史不可更改的連結串列資料結構而已。

在比特幣和其他密碼加密貨幣的情況下,這些資料指的是一組組交易資料。當然在其他情況下,這個資料可以是任何資料型別。

區塊鏈技術引起了新的“全電子”貨幣,如比特幣和萊特幣的發展,這些貨幣不是由一個集中式的權威機構發行和管理的。同時,區塊鏈也給分散式計算帶來了革命,帶來了以太坊技術,出現了像智慧合約(smart contracts)這樣的概念。

本文將實現一個只有50行程式碼的最簡區塊鏈,稱為SnakeCoin。

一、首先我們定義區塊,在一個區塊中,儲存著一個時間戳和一個(可選的)索引。為了保證整個區塊鏈的完整性,每個區塊有一個標記自己身份的雜湊值,像萊特幣,每個區塊的雜湊值都是由一個密碼學演算法根據區塊的索引、時間戳、資料以及前一個區塊的雜湊值生成的。區塊的資料可以是任何你想要的東西。
import hashlib as hasher

class Block:
  def __init__(self, index, timestamp, data, previous_hash):
    self.index = index
    self.timestamp = timestamp
    self.data = data
    self.previous_hash = previous_hash
    self.hash = self.hash_block()
  
  def hash_block(self):
    sha = hasher.sha256()
    sha.update(str(self.index) + 
               str(self.timestamp) + 
               str(self.data) + 
               str(self.previous_hash))
    return sha.hexdigest()

太棒了!我們有自己的區塊結構了,但我們需要建立一個區塊鏈啊。我們需要開始把區塊附加到實際的鏈條上。前面提到過,每個區塊需要前面區塊的資訊,那麼問題來了:區塊鏈裡的第一個區塊是怎麼來的?好吧,第一個區塊,或者說創世區塊,是一個特殊的區塊,在許多情況下,這是通過手工或者一個唯一的邏輯新增上去的。


這裡我們建立一個函式,為了簡化起見,簡單地返回一個創世區塊。這個區塊的索引是0,它的資料值和previous hash引數是任意指定的。

import datetime as date

def create_genesis_block():
  # Manually construct a block with
  # index zero and arbitrary previous hash
  return Block(0, date.datetime.now(), "Genesis Block", "0")
現在,我們能夠建立一個創世區塊了,接下來我們需要一個函式來生成區塊鏈裡的後續區塊,這個函式將鏈條中的前一個區塊作為引數,為新的區塊建立資料,並返回帶有一個帶有合適的資料的新區塊。當新的區塊雜湊來自前面的區塊的資訊,伴隨著新區塊的加入,區塊鏈的完整性也得以增強。如果我們不這麼做的話,那麼外界就很容易用他們的新區塊來替換我們的鏈條裡的區塊,以達到“篡改歷史”的目的。

這個雜湊值的鏈條起到了密碼學證據的作用,並確保一旦一個區塊加入了區塊鏈,它就不能被替換和修改。
def next_block(last_block):
  this_index = last_block.index + 1
  this_timestamp = date.datetime.now()
  this_data = "Hey! I'm block " + str(this_index)
  this_hash = last_block.hash
  return Block(this_index, this_timestamp, this_data, this_hash)
這就是主要的工作了,現在我們可以建立我們的區塊鏈了。在我們這個例子裡,區塊鏈本身是一個簡單的Python list。list的第一個元素就是創世區塊,當然,我們需要繼續新增區塊。因為SnakeCoin是一個最簡區塊鏈,只有20個新的區塊,我們可以在一個for迴圈裡搞定。

# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20

# Add blocks to the chain
for i in range(0, num_of_blocks_to_add):
  block_to_add = next_block(previous_block)
  blockchain.append(block_to_add)
  previous_block = block_to_add
  # Tell everyone about it!
  print "Block #{} has been added to the blockchain!".format(block_to_add.index)
  print "Hash: {}\n".format(block_to_add.hash) 
讓我們測試一下目前的成果:

搞定!我們的區塊鏈跑起來了。如果你想在console上看到更多資訊,你可以稍微修改一下程式碼,把每個區塊的時間戳或者資料打印出來。

這就是SnakeCoin能夠提供的所有功能了,如果要讓SnakeCoin擴充套件到實際的生產環境的區塊鏈的規模,還需要新增類似伺服器層的功能,在多臺機器上追蹤對鏈條的變更,加上一個工作證明演算法(proof-of-work algorithm)來限制在一個給定的時間段之內新增的區塊的數量。

如果你想深入瞭解,可以讀下原始的比特幣的白皮書:https://bitcoin.org/bitcoin.pdf。祝你好運、happy hacking!

原連結:https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b

相關推薦

簡單區塊實現50程式碼

什麼是區塊鏈(Blockchain)? 一個電子記賬本,以比特幣和其他密碼加密貨幣進行的交易公開地、按照日期順序記錄其中。 總的來說,它是一個公開的資料庫,新的資料儲存在一個稱為區塊的容器中,並且附加到一個“不可變”的鏈條(即區塊鏈)上,鏈條上還有以前附加的資料。這裡的“不

quartz任務排程框架實現任務定時執行傳參的配置

quartz是一個任務排程框架,可以用它來實現一些需要定時執行的任務。 本次實現的是spring配置整合quartz 1.配置如下:目標bean和bean中的方法需要自己定義,這個方法就是要執行

java簡單複製檔案方法依賴任何框架

java最簡單複製檔案方法   把java2.txt內容複製到java.txt中   import java.io.File; import java.io.IOException; import java.nio.file.Files; im

區塊創業這些認識很重要擁抱變化更要明確方向

區塊鏈創業在區塊鏈發展的過程裏,不斷出現的各種區塊鏈應用總能帶給人們不一樣的驚喜。除了區塊應用在不斷豐富,區塊鏈本身的內部組織架構也在發生變化。當前,區塊鏈的組織架構主要有以下幾種形態。1、社區型:比特幣( Bitcoin) ,數字貨幣,2009年至今。2、社區+基金會:以太坊( Ethereum) ,智能合

史上強圖解Treap總結 是淺談

大家都很強, 可與之共勉。 Treap = Tree + Heap. 樹堆,在資料結構中也稱Treap,是指有一個隨機附加域滿足堆的性質的二叉搜尋樹,其結構相當於以隨機資料插入的二叉搜尋樹。其基本操作的期望時間複雜度為O(logn)。相對於其他的平衡二叉搜尋

JVM的工作原理我只是簡單的說下知道對不對

        在Java中引入了虛擬機器的概念,即在機器和編譯程式之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程式一個的共同的介面。編譯程式只需要面向虛擬機器,生成虛擬機器能夠理解的程式碼,然後由直譯器來將虛擬機器程式碼轉換為特定系統的機器碼執行

創建自己的區塊遊戲SLOT——以太坊代幣

rdm con there ppi multipl als div play 數組 一個以太坊合約版本的輪盤遊戲,向合約轉賬ETH,有幾率獲得3,5,10,100倍獎勵 合約地址:0x53DA598E70a1505Ad95cBF17fc5DCA0d2c51174b 捐贈ET

史上簡單的SpringCloud教程 | 第四篇:斷路器Hystrix

技術分享 熔斷器 enable layer get local nsh 12c host 在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。為了保證

史上簡單的SpringCloud教程 | 第四篇:斷路器Hystrix(Finchley版本)

stat api serve 依賴 網頁 固定 lock 不能 mar 在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。為了保證其高可用,單個服務

區塊教程eth原始碼分析CMD深入分析

  兄弟連區塊鏈教程eth原始碼分析CMD深入分析(二),cmd包下的geth子包主函式啟動的各個子命令解析 ### cmd包下的geth子包主函式啟動的各個子命令解析 #### /geth * __init__ function:匯入創世塊的json,以指定的json作為創世塊args:<ge

【線上直播】區塊時代-360度認知未來科技核動力

嘉賓:劉朋     劉朋簡介: - 諾基亞通訊成都研發中心研發經理,諾基亞成都研發中心ecosystem建設總監。10年+軟體行業開發、團隊教練和團隊管理經驗,在敏捷最佳實踐、軟體開發高效能團隊領域有豐富的理論和實戰經驗。   - 認證團隊教練,獲得ICF(Int

python爬蟲實戰:利用scrapy短短50程式碼下載整站短視訊

近日,有朋友向我求助一件小事兒,他在一個短視訊app上看到一個好玩兒的段子,想下載下來,可死活找不到下載的方法。這忙我得幫,少不得就抓包分析了一下這個app,找到了視訊的下載連結,幫他解決了這個小問題。 因為這個事兒,勾起了我另一個念頭,這不最近一直想把python爬蟲方面的知識梳理梳理嗎,乾脆藉機行事,正湊

DHL&埃森哲趨勢報告:區塊完全有能力顛覆整個物流業中文版

不久前,DHL和埃森哲聯合釋出了一份針對區塊鏈技術應用於物流領域的趨勢報告,該報告指出區塊鏈技術完全有能力改變整個物流行業。 該報告表示:“區塊鏈是一種全新的資料庫系統,它能對資料以及交易進行維護、記錄和認證。”在物流鏈裡,產品上會配備幾個不同的識別符,它

區塊鼻祖比特幣之12:SPV 節點與Bloom 過濾器

   (SPV) 節點        並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客戶端被設計成運行在空間和功率受限的裝置上,如智慧電話、平板電腦、嵌入式系統等。對於這樣的裝置,通過簡化的支付驗證(SPV)的方式可以使它們在不必儲存完整區塊鏈的情況下進行工作。這種型別的

Android WiFi功能實現知其然必知其所以然

        有一段時間沒有更新部落格,想說的話太多,一時間都堆積在一起。還沒有練就一心兩用的神功,只好一點一點理清後跟大家說一說。 馬上就是平安夜,然後聖誕節。這些年一直沒有過一次這西方的節日。此次也很想親身體驗一番,所以定好行程,從五道口至西單,然後三里屯和工體。看

DFT演算法的理解和實現望各位高手指點指點謝謝

DFT的公式:      其中X(k)表示DFT變換後的資料,x(n)為取樣的模擬訊號,公式中的x(n)可以為覆信號,實際當中x(n)都是實訊號,即虛部為0,此時公式可以展開為:   從這個公式可以看出,變換後的資料就是原訊號對cos和sin的相關操作,即進行相乘求和(

UE4實現紋理隨物體縮放WorldAlignedTexture

UE4編輯器藍圖實現物體縮放,紋理不隨著物體縮放: 一般情況下,紋理會跟著物體的縮放而縮放: 那麼如果不想紋理跟著物體縮放而縮放,可以通過藍圖來實現:基本思路是讓貼圖在世界座標中進行重疊,所以無論

webView簡單使用:網頁中有電話在客戶端點選打電話

一: layout 中的佈局檔案 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/a

區塊』從零構建以太坊Ethereum智慧合約到專案實戰-黎躍春-專題視訊課程...

『區塊鏈』從零構建以太坊(Ethereum)智慧合約到專案實戰—3317人已學習 課程介紹        區塊鏈技術被認為是繼蒸汽機、電力、網際網路之後,下一代性的核心技術。 如果說蒸汽機釋放了人們的生產力,電力解決了人們基本的生活需求,網際網路徹底改變了資訊傳遞的方式,那麼

[幣嚴區塊]數字貨幣交易所之比特幣BTC錢包對接 | 自建節點JSON-RPC訪問

關閉 參數 info 密碼 重新 說明 賬戶 none ransac BTC錢包對接流程 一. 部署BTC錢包節點 二. 分析BTC錢包的API 三. 通過JSON-RPC訪問BTC錢包API 四. 部署測試 一、部署錢包節點 交易平臺對接BTC之前,要