专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
程序员的那些事  ·  余承东暗讽某大厂,雷军疑似回应“诋毁是仰望” ... ·  2 天前  
码农翻身  ·  投诉领导被光速开除,和烂人说再见啦~ ·  8 小时前  
程序员小灰  ·  39岁的小灰,再也回不去童年了! ·  2 天前  
伯乐在线  ·  为什么 DeepSeek ... ·  昨天  
伯乐在线  ·  为什么 DeepSeek ... ·  昨天  
51好读  ›  专栏  ›  程序员大咖

用 Python 撸一个区块链

程序员大咖  · 公众号  · 程序员  · 2018-05-08 10:24

正文

请到「今天看啥」查看全文


  1. import hashlib

  2. import json

  3. from time import time

  4. class Blockchain(object):

  5.    def __init__(self):

  6.        self.current_transactions = []

  7.        self.chain = []

  8.        # Create the genesis block

  9.        self.new_block(previous_hash=1, proof=100)

  10.    def new_block(self, proof, previous_hash=None):

  11.        block = {

  12.            'index': len(self.chain) + 1,

  13.            'timestamp': time(),

  14.            'transactions': self.current_transactions,

  15.            'proof': proof,

  16.            'previous_hash': previous_hash or self.hash(self.chain[-1]),

  17.        }

  18.        # Reset the current list of transactions

  19.        self.current_transactions = []

  20.        self.chain.append(block)

  21.        return block

  22.    def new_transaction(self, sender, recipient, amount):

  23.        self.current_transactions.append({

  24.            'sender': sender,

  25.            'recipient': recipient,

  26.            'amount': amount,

  27.        })

  28.        return self.last_block['index'] + 1

  29.    @property

  30.    def last_block(self):

  31.        return self.chain[-1]

  32.    @staticmethod

  33.    def hash(block):

  34.        block_string = json.dumps(block, sort_keys=True).encode()

  35.        return hashlib.sha256(block_string).hexdigest()

上面的代码应该很直观,我们基本上有了区块链的雏形。但此时你肯定很想知道一个区块究竟是怎样被创建或挖掘出来的。

新的区块来自工作量证明(PoW)算法。PoW 的目标是计算出一个符合特定条件的数字,这个数字对于所有人而言必须在计算上非常困难,但易于验证。这就是工作量证明的核心思想。

举个例子:

假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以 0 结尾,即 hash(x * y) = ac23dc...0。设 x = 5,求 y?

  1. from hashlib import sha256

  2. x = 5

  3. y = 0  # We don't know what y should be yet...

  4. while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":

  5.    y += 1

  6. print(f'The solution is y = {y}')

结果是 y = 21 // hash(5 * 21) = 1253e9373e...5e3600155e860

在比特币中,工作量证明算法被称为 Hashcash,它和上面的问题很相似,只不过计算难度非常大。这就是矿工们为了争夺创建区块的权利而争相计算的问题。通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,就会获得一定数量的比特币奖励(通过交易)。

网络要验证结果,当然非常容易。

让我们来实现一个 PoW 算法,和上面的例子非常相似,规则是:寻找一个数 p,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。

  1. import hashlib

  2. import json

  3. from time import time







请到「今天看啥」查看全文