我是靠谱客的博主 靓丽日记本,最近开发中收集的这篇文章主要介绍【无标题】构建一个区块链,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这篇文章是近期看到比较优质的文章,全文如下:

首先,我导入了 hashlib和datetime,让我们分别计算哈希和时间戳块。

导入是将代码从一个模块传输到另一个模块的修改。如果没有 datetime 导入,我的区块链将无法处理时间戳,或者在没有 hashlib 导入的情况下无法创建哈希。

区块链包含两个类:Block类和Blockchain类。添加到区块链的每个块都使用Block类进行相同的建模。

块类
该块必须包含以下属性:

区块的编号,设置为 0,因为它是链中的第一个区块,称为创世区块
数据,设置为无
接下来,设置为无。这充当了指向下一个块的指针,继续链接的趋势。
哈希,设置为无。块的散列是至关重要的,因为它是使区块链如此安全和不可变的密码学的一部分。
nonce,设置为 0。 nonce 是一个随机整数,一遍又一遍地迭代,直到找到“Golden Nonce”。在工作量证明中,矿工们首先竞争找到正确的哈希值。随机数更改多次,直到它有助于生成正确的哈希。这样就完成了区块的验证,区块就可以加入链中了。
前一个哈希,设置为 0x0。存储前一个块的散列使区块链不可变,因为更改一个块的散列会影响所有后续块。
时间或时间戳,描述交易发生的时间,用于同步网络中的所有块。


Block类,它确定添加到链中的每个块的标准

当我们创建一个块时,我们存储它的数据。构造函数init初始化类的属性。自我和数据表示将包含在对象(块)中的内容。

哈希
下一步是添加哈希函数,计算区块的哈希值。

将nonce、data、前一个 hash、timestamp和块号放入一个字符串并通过 SHA-256 函数运行。SHA-256 是一种常用于区块链的加密哈希算法。“ h ”是使用 SHA-256 的变量。因为我在代码开头导入了hashlib,所以可以使用SHA-256。散列函数中的所有组件将创建块的散列,在创建新块时将其添加到散列字段中。

图片中的最后一行描述了将在输出中显示的内容或打印的内容。在这种情况下,输出将显示块的哈希和块号。

区块链类
下一步是创建代码的第二个类:Blockchain类。区块链类包括:

难度,设置为20。通过增加难度,我们有效地减小了目标范围。减小目标范围会使挖掘块变得更加困难,这在处理具有许多节点的网络时非常有用以找到可接受的哈希值。


最大随机数,设置为 2 的 32 次方,即 32 位数字中可以存储的最大数。随机数必须小于要接受的目标数。
目标数,设置为 2 的 256 次方减去难度。在这种情况下,难度为 20。
区块链中的第一个块是创世块,如第 34 行所示。现在,我完全陷入了下一行代码:dummy = head = block。任何链表的开头都称为head。由于我们的链表的头部是创世块,我们在代码中将其写为head = block。然而,仅此一点还不够具体——在 Python 中,对象是通过引用传递的。Head和block会指向同一个东西。必须在head变量(在本例中为dummy )之前写入一个随机变量,以告诉计算机head与block指向的对象不同。

添加块
我们将继续认为区块链是add函数的链表,用于将块添加到链中。

区块链在哈希的帮助下形成一个链表。哈希将块联系在一起,使其不可变。前一个哈希(第 39 行)必须设置为等于当前位于列表顶部的块。然后,将新块设置为等于当前块加一,如第三行代码所示。

最后两行有助于形成区块链的形状。如“self.block.next = block”所示,每个块都有一个指向下一个块的指针,因此下一个指针被设置为块。这会将块添加到列表的末尾。下一行“self.block = self.block.next”将指针向前移动以继续将块添加到列表末尾的趋势。

矿业
接下来我添加了一个挖矿功能。我使用了工作量证明共识机制,比如比特币。为了将块添加到链中,节点会尝试不同的随机数,直到找到小于目标范围的哈希值。

第 46 行开始一个循环。它首先设置一些猜测准则(范围),从 0 到最大随机数。它在第 47 行继续检查当前块的哈希是否小于或等于目标。哈希必须在 Python 中转换为整数,因此是int。如果哈希值低于目标值,该过程将继续,并且可以添加块(第 48 行)。接下来,打印块,最后,我们暂停挖矿。但是,如果哈希不小于目标数,我们将随机数加 1 并重试。

整理起来
我们以从第 56 行开始的循环结束我们的代码。它计算 10 个随机块。你可以玩弄这些数字,但它总是会停在你插入的任何整数处。

第 60 行提示打印 10 个块。一旦你完成了这条线,你就正式完成了!运行几次以检查错误并欣赏您的作品。仅用 61 行代码,您就创建了一个可以生成块、计算哈希并将所有内容放在一起的区块链!

整体代码如下

import datetime
import hashlib
 
class Block:
    blockNo = 0
    data = None
    next = None
    hash = None
    nonce = 0
    previous_hash = 0x0
    timestamp = datetime.datetime.now()
 
    def __init__(self, data):
        self.data = data
 
    def hash(self):
        h = hashlib.sha256()
        h.update(
        str(self.nonce).encode('utf-8') +
        str(self.data).encode('utf-8') +
        str(self.previous_hash).encode('utf-8') +
        str(self.timestamp).encode('utf-8') +
        str(self.blockNo).encode('utf-8')
        )
        return h.hexdigest()
 
    def __str__(self):
        return "Block Hash: " + str(self.hash()) + "nBlockNo: " + str(self.blockNo) + "nBlock Data: " + str(self.data) + "nHashes: " + str(self.nonce) + "n--------------"
 
class Blockchain:
 
    diff = 20
    maxNonce = 2**32
    target = 2 ** (256-diff)
 
    block = Block("Genesis")
    dummy = head = block
 
    def add(self, block):
 
        block.previous_hash = self.block.hash()
        block.blockNo = self.block.blockNo + 1
 
        self.block.next = block
        self.block = self.block.next
 
    def mine(self, block):
        for n in range(self.maxNonce):
            if int(block.hash(), 16) <= self.target:
                self.add(block)
                print(block)
                break
            else:
                block.nonce += 1
 
blockchain = Blockchain()
 
for n in range(10):
    blockchain.mine(Block("Block " + str(n+1)))
 
while blockchain.head != None:
    print(blockchain.head)
    blockchain.head = blockchain.head.next
————————————————
版权声明:本文为CSDN博主「小草cys」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WASEFADG/article/details/124907287

最后

以上就是靓丽日记本为你收集整理的【无标题】构建一个区块链的全部内容,希望文章能够帮你解决【无标题】构建一个区块链所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部