python函数解读_通过7个Python函数来解释区块链
我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热。我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值。
我对区块链的看法是它是一个公开的加密数据库。如果你是亚马逊并且你想使用该技术来跟踪库存水平,那么使用区块链是否有意义?可能没有,因为你的客户不想花费资源来验证你的区块链,因为他们只顾看着网站说Only 1 left!。
我会让你考虑未来的应用。所以不用多说,让我们看看我们的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()
区块链的核心是hash函数。如果没有加密,区块链将易于操作,并且交易将能够以欺诈方式写入。
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
state是来记录谁拥有代币交易情况。例如,我有10个代币,我给1到Medium,然后状态state将是下面字典的值。
{‘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个函数。我们如何与它互动?好吧,首先我们需要用Genesis Block启动我们的区块链。这是我们的新代币(或库存等)的开始。出于本文解释说明的目的,我会说我是Tom,将从拥有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)
state更新显示谁拥有多少代币:
{'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'}]
我们创建了第一个新交易并将其插入到堆栈顶部。现在,我希望我已经激起了你的好奇心,并且有兴趣将代码复制下来并使用它。在我看来,这是学习新技术的最佳方式 ——进入它。
玩代码并制作自己的代币。如果你试图提供比目前存在的更多代币会怎么样? 如果你继续创造新的收款人,会发生什么?
你能想到区块链的未来应用吗?
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
这里是原文
python函数解读_通过7个Python函数来解释区块链相关推荐
- 区块链数学建模_试图通过高中数学课程来解释区块链
区块链数学建模 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 试图通过高中数学课程来解释区块链 (Blockchain explained by trying ...
- python编程基础_月隐学python第2课
python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...
- 查看Python的版本_查看当前安装Python的版本
一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...
- python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...
前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好? 如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...
- 函数进阶_月隐学python第11课
目录 1.函数类型 2. 匿名函数 3.传入函数(理解) 4.闭包 5.偏函数 6.变量的作用域 6.1 变量作用域的分类 6.2 变量作⽤域查找规则 6.3 全局变量和局部变量 6.4 global ...
- pythontype函数使用_基础教程:python isinstance与type函数用法
这两个函数有意义用法差不多,都是查看对象的,但是两者之间也有一定区别,具体内容请看下文~ 两者区别: type()是一个内置函数,可以用来查询变量所指的对象类型 isinstance()是用来判断该变 ...
- python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解
导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...
- python数据参数_零基础学习python数据分析——函数的参数
原标题:零基础学习python数据分析--函数的参数 上一节课中我们讲了python的函数定义,Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数 ...
- python imshow参数_用matplotlib中imshow()函数绘图
matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...
最新文章
- 工厂模式理解了没有?
- 相似图片搜索的原理(转)
- 数据结构--位图 BitMap
- 雷军:我40岁一事无成
- Spring AOP之注解配置篇
- 吴恩达创建deeplearning.ai讲授AI课程 ,向全世界普及深度学习知识
- 几种ELK常见的架构模式
- 微服务深入浅出(4)-- 负载均衡Ribbon
- Atitit.jsou html转换纯文本 java c# php
- ubunut 安装 pyqt5
- java ResourceBundle
- mysql字段长度的作用_数据库字段的长度 作用
- 【HTML 5】HTML5 Canvas rect(), strokeRect() 和 fillRect() 的区别
- Nginx 反向代理 负载均衡 动静分离 高可用 原理
- android app数据电脑,Android APP连接电脑数据库(以SQL Server为例)
- Django restframework 认证
- 一件衣服95元,如果消费满300元,可以打八五折。输入购买衣服数,输出需要支付的金额。
- 部分景观指数的生态学意义
- 此主机不支持“Intel EPT”硬件辅助的 MMU 虚拟化。。
- mysql数据库同步工具_mysql同步工具_mysql数据库同步
热门文章
- Windows Phone本地数据库(SQLCE):13、更新数据(翻译)
- JVM笔记1:Java内存模型及内存溢出
- 查看磁盘I/O操作信息
- AttributeError: Can‘t get attribute ‘Net‘ on module ‘__main__‘
- QuickLook——万能预览之王
- FFmpeg4.0.2 over版本av_register_all()流程(二十九)
- Android7.0以上增加(/system/lib/libtest.so)系统库文件
- C++类模版demo
- Android: app不被系统kill掉
- MySQL事务学习总结