0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过这7个函数来探索区块链

C语言专家集中营 来源:工程师曾玲 2019-02-02 14:04 次阅读

我想对很多人来说,区块链是一种很难理解的技术,虽然我也看了很多视频和文章,但从我个人角度来讲,直到我开始写一些简单的区块链应用,我才真正理解了它是什么以及它的潜在应用。

我对区块链的看法是,它是一个公开的加密数据库。举个例子,亚马逊也许想利用这种技术来跟踪库存水平,那么使用区块链是否有意义呢?大概率没有,因为消费者不会愿意花费资源来验证亚马逊的区块链是否可行,更别说亚马逊总是在网站上宣称商品“只剩最后一个!”。

关于区块链未来可能的应用场景留给您自己思考,废话不多说,让我们一起通过这7个函数来探索区块链吧。

def hash_function(k):

"""Hashes our transaction."""

if type(k) is not str:

k = json.dumps(k, sort_keys=True)

return hashlib.sha256(k).hexdigest()

区块链的核心是哈希函数,如果不加密,区块链将很容易被操纵,交易将能够被欺骗性地插入到区块链中。

def update_state(transaction, state):

state = state.copy()

for key in transaction:

if key in state.keys():

state[key] += transaction[key]

else:

state[key] = transaction[key]

return state

所谓的“状态”是交易完成后的资产分配记录。比如,我有10个币,我把其中1个币给了Medium那么当前的“状态”就是如下字典中的值。

{‘transaction’: {‘Tom’: 9, ‘Medium’: 1}}

值得注意的是,在这个体系中,透支是不可能存在的。如果我只有10个币,那么我不可能将11个币给别人。下面的函数将验证我们尝试进行的交易确实是有效的。而且,交易必须平衡,我不可能给了对方5个币,但他只收到4个币,否则会引起币的销毁和创建。

def valid_transaction(transaction, state):

"""A valid transaction must sum to 0."""

if sum(transaction.values()) is not 0:

return False

for key in transaction.keys():

if key in state.keys():

account_balance = state[key]

else:

account_balance = 0

if account_balance + transaction[key] < 0:

return False

return True

现在我们可以构建自己的区块了。读取上一个区块的信息,并将其链接到下一个区块,这也是区块链的核心技术之一,看起来有效交易可以被欺诈性地插入到区块链中,但是对前面所有的区块进行解密在计算上几乎是不可能的,这就保留了区块链的完整性。

def make_block(transactions, chain):

"""Make a block to go into the chain."""

parent_hash = chain[-1]['hash']

block_number = chain[-1]['contents']['block_number'] + 1

block_contents = {

'block_number': block_number,

'parent_hash': parent_hash,

'transaction_count': block_number + 1,

'transaction': transactions

}

return {'hash': hash_function(block_contents), 'contents': block_contents}

下面是一个小小的帮助函数,用于检查前一个区块的哈希值。

def check_block_hash(block):

expected_hash = hash_function(block['contents'])

if block['hash'] is not expected_hash:

raise

return

一旦我们把所有的东西整合起来,就是时候创建自己的区块了。接下来我们将更新区块链。

def check_block_validity(block, parent, state):

parent_number = parent['contents']['block_number']

parent_hash = parent['hash']

block_number = block['contents']['block_number']

for transaction in block['contents']['transaction']:

if valid_transaction(transaction, state):

state = update_state(transaction, state)

else:

raise

check_block_hash(block) # Check hash integrity

if block_number is not parent_number + 1:

raise

if block['contents']['parent_hash'] is not parent_hash:

raise

return state

在完成之前,区块链必须经过验证:

def check_chain(chain):

"""Check the chain is valid."""

if type(chain) is str:

try:

chain = json.loads(chain)

assert (type(chain) == list)

except ValueError:

# String passed in was not valid JSON

return False

elif type(chain) is not list:

return False

state = {}

for transaction in chain[0]['contents']['transaction']:

state = update_state(transaction, state)

check_block_hash(chain[0])

parent = chain[0]

for block in chain[1:]:

state = check_block_validity(block, parent, state)

parent = block

return state

最后,需要一个交易函数,将所有上述功能整合在一起:

def add_transaction_to_chain(transaction, state, chain):

if valid_transaction(transaction, state):

state = update_state(transaction, state)

else:

raise Exception('Invalid transaction.')

my_block = make_block(state, chain)

chain.append(my_block)

for transaction in chain:

check_chain(transaction)

return state, chain

现在我们有了7个函数,那么怎样使用它们呢?首先,我们需要一个创世块来开始我们的区块链,这也是新币产生的开始。在这篇文章里,我将会从10个币开始。

genesis_block = {

'hash': hash_function({

'block_number': 0,

'parent_hash': None,

'transaction_count': 1,

'transaction': [{'Tom': 10}]

}),

'contents': {

'block_number': 0,

'parent_hash': None,

'transaction_count': 1,

'transaction': [{'Tom': 10}]

},

}

block_chain = [genesis_block]

chain_state = {'Tom': 10}

那么,当我将一些币给Medium之后发生了什么呢?

chain_state, block_chain = add_transaction_to_chain(transaction={'Tom': -1, 'Medium': 1}, state=chain_state, chain=block_chain)

状态”的值将会被更新为当前各人拥有多少个币:

{'Medium': 1, 'Tom': 9}

然后生成的区块链会如下所示:

[{'contents': {'block_number': 0,

'parent_hash': None,

'transaction': [{'Tom': 10}],

'transaction_count': 1},

'hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93'},

{'contents': {'block_number': 1,

'parent_hash': '064d0b480b3b92761f31831d30ae9f01954efaa62371b4b44f11465ec22abe93',

'transaction': {'Medium': 1, 'Tom': 9},

'transaction_count': 2},

'hash': 'b4ae25f0cc0ee0b0caa66b9a3473e9a108652d53b1dc22a40962fef5c8c0f08c'}]

至此,我们的第一个交易已经创建并被插入到堆栈的顶部。现在,我希望这些已经激起你的好奇心,并且有兴趣将代码复制下来跑一跑。在我看来,这是学习新技术的最佳途径。

请尝试运行代码去创造自己的币。思考一下,如果您想提供比现存更多的币,会发生什么情况?如果您不断创建新的收款人,会发生什么?

还有,您能想到区块链在未来会被应用到哪些场景呢?欢迎在评论中留言。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 区块链
    +关注

    关注

    111

    文章

    15562

    浏览量

    105981

原文标题:通过7个函数解密区块链

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    区块如何改变AI

    于决策、评估和理解某些模式和数据集,最终产生自主交互。人工智能和区块共同拥有几个特点,可以确保在不久的将来能够实现无缝互动。下面列出了三主要特点。I.人工智能和区块
    发表于 02-27 14:01

    什么是区块 区块有什么用

    账本的数据。同时,区块还具有去中介化、信息透明等特点。  “区块技术本质上是一种数据库技术,具体讲就是一种账本技术。账本记录一或多个账
    发表于 03-26 11:31

    区块不是泡沫 马云或将创造新的神话

    那时候根本没明白什么是区块,但听说东西能够解决数据的安全和隐私,阿里巴巴就开始投入区块。”同时马云也强调,
    发表于 05-18 18:10

    区块在商业方面的应用如何

    ,形成一数据记录,通过区块可以让交易的各方交易过程更加透明,更方便对资金及物流进行监管,避免虚假交易的产生。供应金融管理应用系统。 随
    发表于 07-14 11:31

    区块将改革供应

    团队携手研发出区块应用系统,它对于整个供应的权益有以下几点:1) 对于生产者:通过消费者对商品的购买数据以及零售商的销售业绩来推动生产者的进步,
    发表于 08-08 11:11

    区块热度不止,参考架构9部分解密

    应用。其中,区块技术仍然处于实验探索阶段,各方对于区块的概念、适用场景、架构、技术特点、发展路线及治理与监管尚未形成共识。比较常见的观点
    发表于 09-06 17:48

    区块技术开发公司谈区块赚钱满足人哪些需求

    在日常生活中需要什么?  第一,利益保护需求  我们知道的区块是赚钱的,它所使用的整个系统是非常安全的。因为每个人都会建立自己的制度来最大化自己的利益。当我们在区块中赚钱时,我们可
    发表于 11-19 17:14

    浅谈区块对银行业的发展

    `区块软件谈区块对银行业的发展前者是通过人来记账,后者则是通过计算机来记账。因为人太“聪明”
    发表于 11-19 17:19

    区块将如何优化产业

    ,他供应了各种开发言语(相似JAVA等)帮忙开发者开发或许将原有的一些互联网运用移植再造到去中心化的网络构建中。所以,整个区块的工业开端衍生出了各个不同的生态层次。  区块
    发表于 12-13 15:19

    区块对我们的生活有什么影响

    未来是光明的,它是由区块驱动的。区块技术已经通过颠覆性的应用程序改变了金融行业,但金融业只是冰山一角。
    发表于 07-10 04:20

    区块+从全球50案例看区块的应用与未来》高清pdf

    技术发展到今天,已经进入了一全新的时代:由信息互联逐步发展至价值互联,而实现关键转变需要一种能适用于全球的底层价值互联网技术。在这个背景下,区块技术以“安全、公开、透明、数据不可
    发表于 03-13 00:42

    区块钱包软件开发,区块钱包源码搭建

    什么是区块钱包?区块钱包本质上是一工具,目前绝大多数的区块
    发表于 05-26 16:30

    区块分成两部分, 一区块,一

    了上一区块的HASH值(通过散列函数变换的散列值)和本区块的HASH值。本区块的HASH,又在
    发表于 03-20 08:55

    什么是区块区块都有哪些应用?

    什么是区块区块未来的应用前景怎样?
    发表于 06-28 09:20

    用不到50行的 Python 2.x代码实现一简单的区块

    现在我们可以创建创世区块了,我们需要一函数来生成该区块中的后继区块。该
    的头像 发表于 03-29 15:29 5931次阅读
    用不到50行的 Python 2.x代码实现一<b class='flag-5'>个</b>简单的<b class='flag-5'>区块</b><b class='flag-5'>链</b>