查看: 2437|回复: 1

一文告诉你区块链中的“块”的生成方式及函数代码

[复制链接]
发表于 2019-1-16 13:16:50 | 显示全部楼层 |阅读模式
这里我们讨论的是区块链。区块链上所定义的协议不仅是要交易数据而且还要交易数据的价值。目前的主要方式是在互联网出现之前发明的,它需要使用一个集中的票据交易所。机器有时需要等待四天才能将付款从一个地方转移到另一个地方,但在所有其他方面,机器之间的通信速度又是惊人的。比如他们可以互相发送小额支付。但必须要满足电力、存储空间和计算等资源的情况下才能立即进行交易。
比特币和其他加密货币作为价值转移的第五个协议层,其底层技术称为区块链。区块链首次允许机器同意价值转移而不必相信一个中央权力机构,在现实世界中如果我创建一个“我”,就只有我拥有它,但如果我创建了一个数字图像,那么在互联网上其他人就可以复制它,然后我们都拥有它,那么就没有办法证明其所有权。但区块链让我们以分散的方式达成共识层, 防止一个坏行为者谎称拥有所有权。
让我们用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):
return hashlib.sha256(str(self.params())。encode())。hexdigest()
块是如何生成的?
用户提供了一些数据在他们的事务中,所以我们可以使用它作为唯一的参数生成函数,因为我们必须获取最后一块才能完成工作。我们将使用最后一块帮助寻找这一块指数以及哈希值,我们还将给它一个时间戳。因此,每个生成的块都通过存储器的哈希值来指向前一个块。
def generate_next_block(self,data):
index = len(self.blockchain_store)
previous_hash = self.latest_block()。hash
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()
return cls(params)
我们将使用它初始化区块链,并将其存储为内存列表
def __init __(self):
self.blockchain_store = self.fetch_blockchain()
def latest_block(self):
return self.blockchain_store [-1]
def fetch_blockchain(self):
return [block.Block.genesis_block()]
记住我这里所说的块哈希值既可以作为它的标识,也可以验证它的完整性。我们可以使用哈希值来判断一个新生成的块,并在给定一个新块和上一个块的联系下查看是否有效,上一个块也就是链中的最后一个块。我们可以先查看正确的排序指数,我们可以检查以前的哈希值属性,并将其匹配到已经验证了过得前一个快,最后我们将计新块的哈希值,确保其准确无误。
def receive_new_block(self, new_block):
previous_block = self.latest_block()
if not new_block.has_valid_index(previous_block):
print(‘invalid index’)
return
if not new_block.has_valid_previous_hash(previous_block):
print(‘invalid previous hash’)
return
if not new_block.has_valid_hash():
print(‘invalid hash’)
return
self.blockchain_store.append(new_block)
假设所有节点都存储了区块链的一个副本,我们需要一种方法来选择在发生冲突时使用哪个区块链。假设2个节点生成相同的块数,那么我们的解决方案是选择具有最长块数的链,因为它的存在时间更长因此它更有可能是真实的区块链。
def replace_chain(self,block:self.blockchain_store):
if self.is_valid_chain(blocks)和len(blocks)》 self.length:
self.blockchain_store = blocks
else:
self.log(“Recieved blockchain invalid”)
给出一个新的区块链之后:我们将检查如果是有效的编程方式,是不是就意味着它有用一个新块的替换我们之前的块,因为每个节点存储一个区块链的副本, 并且块不断生成事务, 这样每个节点就可以进行广播, 每当它生成一个新的块时, 它就会连接到一个新的节点,它可以将块添加到其当前链或整个区块链中, 因此我们可以以封装节点的方式, 以便用户可以查询其他节点创建一个 http 服务器。
因此,用户将通过HTTP请求控制节点,它将通过对WebSockets与其他节点通信。这就是简单的区块链我们要讨论的一个关键特性是工作证明算法。
比特币挖掘节点完成了一系列非常昂贵的计算, 以批准每笔交易, 并获得比特币的计算工作, 以便生成一个新块。但是生成新块的前提必须是突破51%的攻击,这才证明这个新的块是有效的, 可以添加到区块链中, 因此一个坏的行为者必须有更多的计算能力, 而不是一半的比特币网络。
来源:网络,如侵删

发表于 2019-3-28 09:47:12 | 显示全部楼层
专业!谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表