首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过7个函数解密区块链(附代码)

通过7个函数解密区块链(附代码)

作者头像
数据派THU
发布于 2018-07-30 01:50:59
发布于 2018-07-30 01:50:59
4860
举报
文章被收录于专栏:数据派THU数据派THU

翻译:张媛

校对:丁楠雅

本文约2022字,建议阅读5分钟。

本文将通过实例展示如何应用机器学习来更好地匹配学生和导师,最终在Flask图表界面中展示结果。

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

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

关于区块链未来可能的应用场景留给您自己思考,废话不多说,让我们一起通过这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'}]

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

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

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

原文链接: https://www.kdnuggets.com/2018/04/blockchain-explained-7-python-functions.html Blockchain Explained in 7 Python Functions

译者简介

张媛,某云计算公司不务正业服务工程师一枚。喜欢下雨天,读闲书,缺乏技术细胞,欣赏并喜欢有态度有立场的人,爱浪漫,注重仪式感,喜欢记录。最近的愿望是拥有自己的小窝,给想念的人写一封信。

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派THU ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP代码审计笔记--任意文件上传
基于安全方面的考虑,应增加用户上传文件的限制,比如检查文件类型、限制文件大小,限定文件路径,文件名重命名、白名单限制文件上传类型等。
Bypass
2019/07/08
1.1K0
PHP代码审计笔记--任意文件上传
php系列之文件上传实现
<html> <head> <meta content="text/html"charset="utf-8"></meta> </head> <body> <form method="pos
SmileNicky
2022/05/10
4590
PHP单文件上传原理及上传函数的封装操作示例
/ 本文实例讲述了PHP单文件上传原理及上传函数的封装操作。分享给大家供大家参考,具体如下:
用户8664418
2021/07/13
7040
谈谈php中上传文件的处理
  我们在浏览器中编辑自己的信息,会遇到上传头像;在文库中,我们会上传文档......到处存在“上传”这个词。
于果
2021/08/25
7860
PHP如何上传文件和下载,你学会了吗?
​ 在 B/S 程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。
叫我可儿呀
2019/12/04
1.8K0
PHP-文件上传优化
1.7 优化文件上传 1.7.1 更改文件名 方法一:通过时间戳做文件名 <?php $path='face.stu.jpg'; //echo strrchr($path,'.'); //从最后一
cwl_java
2020/03/26
3K0
DVWA靶机之文件上传漏洞通关笔记
文件上传漏洞通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的。
Power7089
2019/07/25
1.8K0
PHP的文件上传操作
HTML5学堂:关于文件上传,主要包括“构建基本表单”-“使用AJAX发送请求,上传文件”-“使用PHP获取文件基本信息”-“执行SQL语言,返回基本图片路径”-“使用DOM操作设置预览图路径”。一起
HTML5学堂
2018/03/12
5.5K0
PHP的文件上传操作
PHP 文件上传代码审计
只验证MIME类型: 代码中验证了上传的MIME类型,绕过方式使用Burp抓包,将上传的一句话小马*.php中的Content-Type:application/php,修改成Content-Type: image/png然后上传.
王 瑞
2022/12/28
1.2K0
【说站】php上传文件代码
以上就是php上传文件代码的分享,在正式上传的时候,我们需要把文件移至服务器,然后对表单进行一系列的操作。大家学会后,可以在php中尝试此种方法。
很酷的站长
2022/11/23
1.6K0
【说站】php上传文件代码
HTML+PHP实现多文件上传
今天用原生的HTML form和PHP实现了多文件上传,感觉比调库要简单很多,可以自由定制和增删功能。
ExASIC
2020/07/23
5.8K3
HTML+PHP实现多文件上传
PHP文件的上传和下载(一)
文件上传是将本地计算机中的文件上传到服务器上的过程。在 PHP 中,文件上传可以通过 HTML 的表单和 PHP 的 $_FILES 超全局变量来实现。
堕落飞鸟
2023/04/27
6870
【php详细笔记】上传文件到服务器
QQ空间里面上传图片呀 微信朋友圈上传图片 发邮件里面上传邮件资料附件 认证的时候要求上传照片或身份证 还有各种产品汪(gou)们提出的需求来分析,上传不同的东西。
20岁爱吃必胜客
2022/11/13
9.9K0
【php详细笔记】上传文件到服务器
php上传文件详解
上传文件功能由两个部分组成,HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件,php部分让我们可以把文件存储到服务器的指定目录。
跑马溜溜的球
2020/12/07
9.7K0
PHP文件上传小结(乱码,移动失败,权限,显示图片)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
星哥玩云
2022/06/30
2.2K0
PHP实现文件上传功能实例代码
以上所述是小编给大家介绍的PHP实现文件上传功能实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对百搜论坛的支持!
PHP开发工程师
2021/04/25
1K0
PHP实现文件上传功能实例代码
php开发_文件上传
=========================================
Hongten
2018/09/13
4.4K0
php开发_文件上传
php实现文件上传
在上述代码中,我们给input按钮设置了file类型,并且给上传的文件名称也设置为file。当我们点击选择文件或者图片时,form表单数据就会发送到upload.php中,然后对上传的文件进行相关的操作。
友儿
2022/07/27
3K0
相关推荐
PHP代码审计笔记--任意文件上传
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档