如何在区块链中创建块

2019-01-08 19:13 栏目:经验之谈 来源:网络整理 查看()
我们在这里谈论区块链。区块链上定义的协议不仅是要交易的数据的价值,还包括要交易的数据。目前的主要方法是在互联网出现之前发明的,它需要使用集中的票证交换。机器有时需要等待四天才能将付款从一个地方转移到另一个地方,但在所有其他方面,机器之间的通信速度是惊人的。例如,他们可以互相发送小额付款。但是,如果必须满足电源,存储空间和计算等资源,则必须立即进行事务处理。

比特币和其他加密货币是价值转移的第五个协议层,底层技术称为区块链。区块链允许机器首次同意价值转移,而不必信任中央机构。在现实世界中,如果我创建一个“我”,那么我只拥有它,但如果我创建一个数字图像,那么互联网上的其他人你可以复制它,然后我们都拥有它,那么就没有办法证明其所有权。但区块链允许我们以分散的方式达到共识水平,防止不良行为者虚假地声称所有权。

让我们在python中构建我们自己的简单区块链,以更好地理解这个令人难以置信的数据结构是如何工作的。为简单起见,让我们定义一个块是什么,假设每个块代表一个事务,并在两台计算机之间传输一个值。要查看以下代码并阅读它,必须使用索引在区块链中显示一组重要属性,这些属性在创建时在区块链中表示,以在其自己的类中定义块对象,该对象将存储一些对象由发件人定义。数据和两个数据哈希值,一个用于区块链中的先前哈希值,另一个用于其自己的哈希值。块需要哈希值的原因是哈希值提供唯一值。 Id,它具有验证数据完整性的能力。

Class Block():

Def __init __(self,params):
  self.index=params.index 
  self.previous_hash=params.previous_hash 
  self.timestamp=params.timestamp 
  self.data=params.data 
  self.hash=self.calc_hash()

我们使用流行的加密散列算法sha-256来帮助从散列函数中的每个块生成256位签名。为此,您必须导入hashlib。

Def calc_hash(self):
 返回hashlib.sha256(str(self.params())。encode())。 Hexdigest()

块是如何生成的?

用户在他们的事务中提供了一些数据,因此我们可以将它作为唯一的参数生成函数,因为我们必须得到最后一块来完成工作。我们将使用最后一篇文章来帮助找到这个索引和哈希值,我们也会给它一个时间戳。因此,每个生成的块通过存储其散列值指向前一个块。

Def generate_next_block(self,data):
  index=len(self.blockchain_store)
  previous_hash=self.latest_block()。哈希 
  timestamp=int(time.time())

Params=block_params.BlockParams(index,previous_hash,timestamp,data)
  new_block=block.Block(params)
  self.blockchain_store.append(new_block)

这是一个叫做区块链的区块

第一个生成的块称为genesis块,我们将其硬编码到预定义属性中的自己的函数中
Def genesis_block(cls):
  params=block_params.BlockParams.genesis_params()
 返回cls(params)

我们将使用它初始化区块链并将其存储为内存列表

Def __init __(self):
  self.blockchain_store=self.fetch_blockchain()
Def latest_block(self):
 返回self.blockchain_store [-1]

Def fetch_blockchain(个体经营):
 返回[block.Block.genesis_block()]

请记住,我在这里讨论的块哈希值可以用作其标识和完整性。我们可以使用哈希值来确定新生成的块,并根据新块和前一个块之间的链接查看它是否有效。前一个块是链中的最后一个块。我们可以先查看正确的排序索引,我们可以检查以前的哈希值属性,并将其与之前已验证的哈希值属性相匹配。最后,我们将计算新块的哈希值以确保它是正确的。

Def receive_new_block(self,new_block):
  previous_block=self.latest_block()

如果不是new_block.has_valid_index(previous_block):
 打印('无效索引')
 返回
 如果不是new_block.has_valid_previous_hash(previous_block):
  print('previous previous hash')
 返回
 如果不是new_block.has_valid_hash():
 打印('无效哈希')
 返回

Self.blockchain_store.append(new_block)

假设所有节点都存储了区块链的副本,我们需要一种方法来选择在发生冲突时使用哪个区块链。假设2个节点生成相同数量的块,我们的解决方案是选择具有最长块数的链,因为它存在的时间更长,因此更有可能成为真正的区块链。

Def replace_chain(self,block:self.blockchain_store):
 如果self.is_valid_chain(blocks)和len(blocks)> self.length:
  self.blockchain_store=blocks 
 否则:
  self.log(“收到区块链无效”)

在给出一个新的区块链之后:我们将检查它是否是一个有效的编程方法,是否意味着它用新的块替换了我们之前的块,因为每个节点都存储了区块链的副本,并且该块不断生成事务以便每个节点可以广播,并且每当它生成新块时,它就连接到一个新节点,该节点将块添加到其当前链或整个区块链。因此我们可以封装节点,以便用户可以查询其他节点来创建http服务器。

因此,用户将通过HTTP请求控制节点,该请求将通过WebSockets与其他节点通信。这是一个简单的区块链。我们将讨论的一个关键特性是工作证明算法。

比特币挖掘节点完成了一系列非常昂贵的计算,以批准每个交易并获得比特币计算以生成新块。但是生成新块的先决条件必须是51%的攻击突破,这证明这个新块是有效的并且可以添加到区块链中,因此一个坏的角色必须具有更多的计算能力,而不是一半的比特币网络。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:币友交流QQ/WX群请联系客服加入!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
虚拟币开发,虚拟币交易平台开发,山寨币交易平台开发 Keywords: 虚拟币开发 虚拟币交易平台开发 山寨币交易平台开发