python区块链(将到来的数字革命?用Python实现一个区块链)
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python是一种面向对象的解释型计算机程序设计语言,下面我们用区块链的实现。
python实现一个基础的区块链
我们实现的区块链有如下几个特性:
可以向区块链中添加多个节点。
工作量证明(PoW)。
简单的节点间冲突解决机制。
使用RSA 加密进行交易。
我们的区块链客户端有如下几个功能:
使用公钥/私钥加密技术生成钱包。(基于RSA算法)。
使用RSA 加密算法生成交易。
我们还实现了2个展示界面:
挖矿者使用的“区块链前端”
用户生成钱包和发币的“区块链客户端”
我在原始代码的基础上进行了一些改动,向交易中加入了RSA加密,并实现了钱包生成和交易加密,两个界面使用HTML/CSS/JS 实现。
用python实现区块链:
首选: 打造一个 Blockchain
新建一个文件 blockchain。py,本文所有的代码都写在这一个文件中。首先创建一个 Blockchain 类,在构造函数中我们创建了两个列表,一个用于储存区块链,一个用于储存交易。
一个区块有五个基本属性:index,timestamp(in Unix time),transaction 列表,工作量证明(稍后解释)以及前一个区块的 Hash 值。
到这里,区块链的概念应该比较清楚了:每个新的区块都会包含上一个区块的 Hash 值。这一点非常关键,它是区块链不可变性的根本保障。如果攻击者破坏了前面的某个区块,那么后面所有区块的 Hash 都会变得不正确。不理解?慢慢消化~
我们需要一个向区块添加交易的方法:
new_transaction() 方法向列表中添加一个交易记录,并返回该记录将被添加到的区块——下一个待挖掘的区块——的索引,稍后在用户提交交易时会有用。
当 Blockchain 实例化后,我们需要创建一个初始的区块(创世块),并且给它预设一个工作量证明。
除了添加创世块的代码,我们还需要补充 new_block(), new_transaction() 和 hash() 方法:
上面的代码应该很直观,我们基本上有了区块链的雏形。但此时你肯定很想知道一个区块究竟是怎样被创建或挖掘出来的。
新的区块来自工作量证明(PoW)算法。PoW 的目标是计算出一个符合特定条件的数字,这个数字对于所有人而言必须在计算上非常困难,但易于验证。这就是工作量证明的核心思想。
举个例子:
假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以 0 结尾,即 hash(x * y) = ac23dc。。。0。设 x = 5,求 y?
结果是 y = 21 // hash(5 * 21) = 1253e9373e。。。5e3600155e860
在比特币中,工作量证明算法被称为 Hashcash,它和上面的问题很相似,只不过计算难度非常大。这就是矿工们为了争夺创建区块的权利而争相计算的问题。通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,就会获得一定数量的比特币奖励(通过交易)。
网络要验证结果,当然非常容易。
让我们来实现一个 PoW 算法,和上面的例子非常相似,规则是:寻找一个数 p,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。
区块链的实现
你可以从终端启动区块链节点,通过进入blockchain文件夹,并输入命令:python blockchain_client。py或python blockchain_client。py -p <;PORT NUMBER>; 。如果你未指定端口号,则会默认端口号为5000。在浏览器中打开http!//localhost!<;PORT NUMBER>;可以看到区块链前端展示界面。
展示界面导航栏有两个标签:
挖掘:用于查看交易和区块链数据,以及挖掘新的交易区块。
配置:用于配置不同区块链节点之间的连接。
下面是blockchain。py文件代码中一些重要部分的说明。
我们首先定义一个具有以下属性的Blockchain类:
transactions:将被添加到下一区块的交易列表。
chain!:实际的区块链,也就是一个区块数组。
nodes:一个包含节点URL的集合。区块链使用这些节点从其他节点中检索区块链数据并且在检查到它们没有同步时更新其区块链。
node_id:一个标识blockchain节点的随机字符串。
这个Blockchain类还实现了以下方法:
register_node(node_url)! 将新的区块链节点添加到节点列表中。
verify_transaction_signature(sender_address, signature, transaction)! 检查提供的签名是否与通过公钥(sender_address)签署的交易相符。
submit_transaction(sender_address, recipient_address, value, signature)! 如果签名通过验证,则将交易添加到交易列表中。
create_block(nonce, previous_hash)!向区块链添加一个交易块。
hash(block)! 创建一个区块的SHA-256散列。
proof_of_work():工作算法的证明。寻找满足挖掘条件的随机数。
valid_proof(transactions, last_hash, nonce, difficulty=MINING_DIFFICULTY)!检查散列值是否满足挖掘条件。该函数在proof_of_work函数中使用。
valid_chain(chain)! 检查区块链是否有效。
resolve_conflicts()!通过用网络中最长链代替链的方法解决区块链节点之间的冲突。
class Blockchain! def __init__(self)! self。transactions = [] self。chain = [] self。nodes = set() #Generate random number to be used as node_id self。node_id = str(uuid4())。replace(-, ) #Create genesis block self。create_block(0, 00) def register_node(self, node_url)!""" Add a new node to the list of nodes """ 。。。 def verify_transaction_signature(self, sender_address, signature, transaction)!""" Check that the provided signature corresponds to transaction signed by the public key (sender_address) """ 。。。 def submit_transaction(self, sender_address, recipient_address, value, signature)!""" Add a transaction to transactions array if the signature verified """ 。。。 def create_block(self, nonce, previous_hash)!""" Add a block of transactions to the blockchain """ 。。。 def hash(self, block)!""" Create a SHA-256 hash of a block """ 。。。 def proof_of_work(self)!""" Proof of work algorithm """ 。。。 def valid_proof(self, transactions, last_hash, nonce, difficulty=MINING_DIFFICULTY)!""" Check if a hash value satisfies the mining conditions。 This function is used within the proof_of_work function。 """ 。。。 def valid_chain(self, chain)!""" check if a bockchain is valid """ 。。。 def resolve_conflicts(self)!""" Resolve conflicts between blockchains nodes by replacing our chain with the longest one in the network。 """ 。。。
下面这一行,我们初始化了一个Python Flask 应用,用于创建和区块链交互的API。
app = Flask(__name__)CORS(app)
下面,比特币走势我们初始化一个区块链对象。
blockchain = Blockchain()
下面我们定义了2种返回我们区块链前端展示界面html页面的Flask路线。
@app。route(/)def index()!returnrender_template(。/index。html)@app。route(/configure)def configure()!returnrender_template(。/configure。html)
下面我们定义了Flask API来管理交易和挖掘区块链。
此API将sender_address, recipient_address, amount 和 signature 作为输入,并且如果签名有效,则将交易添加到将添加到下一个块的交易列表中。
/transactions/get!此API返回所有将会添加到下一个块的交易。
/chain!此API返回所有区块链数据。
/mine! 此API运行工作算法的证明,同时添加新的交易块到区块链。
好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。
","content_hash"!"8a78393f
评论