大数据文摘作品
编译:晚君、molly、蒋宝尚
区块链作为比特币和其他加密货币的核心技术,在最近几年引起了全世界的注意,但是各国这一颠覆性的技术态度不一,因为其去中心化的分布式结构,可以使用户之间直接进行交流,无需中心节点参与的这种技术模式对银行、证券等机构带来了极大影响。
区块链的技术模式和各国对区块链的态度:
g20各国对数字货币观点大盘点,整体友好老矿工5000字区块链终极指南
而在本篇文章,抛开介绍区块链的技术特点和应用场景,文摘菌手把手的教大家如何用python实现一个基础的区块链,和一个区块链的客户端。
我们实现的区块链有如下几个特性:
可以向区块链中添加多个节点。工作量证明(pow)。简单的节点间冲突解决机制。使用rsa 加密进行交易。
我们的区块链客户端有如下几个功能:
使用公钥/私钥加密技术生成钱包。(基于rsa算法)。使用rsa 加密算法生成交易。
我们还实现了2个展示界面:
挖矿者使用的“区块链前端”用户生成钱包和发币的“区块链客户端”
我在原始代码的基础上进行了一些改动,向交易中加入了rsa加密,并实现了钱包生成和交易加密,两个界面使用html/css/js 实现。
完整的项目代码:
')@app.route('/make/transaction')def make_transaction(): return render_template('./make_transaction.html')@app.route('/view/transactions')def view_transaction():return render_template('./view_transactions.html')
下面我们定义一个生成钱包(私有/公钥对)的api。
@app.route('/wallet/new', methods=['get'])def new_wallet():random_gen = crypto.random.new().read private_key = rsa.generate(1024, random_gen) public_key = private_key.publickey() response = { 'private_key': binascii.hexlify(private_key.exportkey(format='der')).decode('ascii'), 'public_key': binascii.hexlify(public_key.exportkey(format='der')).decode('ascii') } return jsonify(response), 200
下面我们定义一个api,将sender_address, sender_private_key, recipient_address, value字段作为输入,并返回交易(没有私钥)和签名。
@app.route('/generate/transaction', methods=['post'])def generate_transaction():sender_address = request.form['sender_address'] sender_private_key = request.form['sender_private_key'] recipient_address = request.form['recipient_address'] value = request.form['amount'] transaction = transaction(sender_address, sender_private_key, recipient_address, value) response = {'transaction': transaction.to_dict(), 'signature': transaction.sign_transaction()} return jsonify(response), 200
区块链的实现
你可以从终端启动区块链节点,通过进入blockchain文件夹,并输入命令:python blockchain_client.py或python blockchain_client.py -p 。如果你未指定端口号,则会默认端口号为5000。在浏览器中打开')@app.route('/configure')def configure():return render_template('./configure.html')
下面我们定义了flask api来管理交易和挖掘区块链。
此api将'sender_address', 'recipient_address', 'amount' 和 'signature' 作为输入,并且如果签名有效,则将交易添加到将添加到下一个块的交易列表中。
'/transactions/get':此api返回所有将会添加到下一个块的交易。'/chain':此api返回所有区块链数据。'/mine': 此api运行工作算法的证明,同时添加新的交易块到区块链。
@app.route('/transactions/new', methods=['post'])def new_transaction():values = request.form # check that the required fields are in the post'ed data required = ['sender_address', 'recipient_address', 'amount', 'signature'] if not all(k in values for k in required): return 'missing values', 400 # create a new transaction transaction_result = blockchain.submit_transaction(values['sender_address'], values['recipient_address'], values['amount'], values['signature']) if transaction_result == false: response = {'message': 'invalid transaction!'} return jsonify(response), 406 else: response = {'message': 'transaction will be added to block '+ str(transaction_result)} return jsonify(response), 201@app.route('/transactions/get', methods=['get'])def get_transactions(): #get transactions from transactions pool transactions = blockchain.transactions response = {'transactions': transactions} return jsonify(response), 200@app.route('/chain', methods=['get'])def full_chain(): response = { 'chain': blockchain.chain, 'length': len(blockchain.chain), } return jsonify(response), 200@app.route('/mine', methods=['get'])def mine(): # we run the proof of work algorithm to get the next proof... last_block = blockchain.chain[-1] nonce = blockchain.proof_of_work() # we must receive a reward for finding the proof. blockchain.submit_transaction(sender_address=mining_sender, recipient_address=blockchain.node_id, value=mining_reward, signature=) # forge the new block by adding it to the chain previous_hash = blockchain.hash(last_block) block = blockchain.create_block(nonce, previous_hash) response = { 'message': new block forged, 'block_number': block['block_number'], 'transactions': block['transactions'], 'nonce': block['nonce'], 'previous_hash': block['previous_hash'], }return jsonify(response), 200
下面我们定义flask api来管理区块链节点。
'/nodes/register':此api将节点url列表作为输入,同时添加url到节点列表。'/nodes/resolve':此api通过使用网络中最长的可用链替代本地链的方式解决区块链节点间的冲突。'/nodes/get':此api返回节点列表。
@app.route('/nodes/register', methods=['post'])def register_nodes():values = request.form nodes = values.get('nodes').replace( , ).split(',') if nodes is none: return error: please supply a valid list of nodes, 400 for node in nodes: blockchain.register_node(node) response = { 'message': 'new nodes have been added', 'total_nodes': [node for node in blockchain.nodes], } return jsonify(response), 201@app.route('/nodes/resolve', methods=['get'])def consensus(): replaced = blockchain.resolve_conflicts() if replaced: response = { 'message': 'our chain was replaced', 'new_chain': blockchain.chain } else: response = { 'message': 'our chain is authoritative', 'chain': blockchain.chain } return jsonify(response), 200@app.route('/nodes/get', methods=['get'])def get_nodes(): nodes = list(blockchain.nodes) response = {'nodes': nodes}return jsonify(response), 200
结论
在此篇文章中,我们介绍了涉及区块链背后一些核心概念,并且学习如何用python实现一个区块链。为了简单起见,此文没有涉及一些技术细节,例如:钱包地址和merkle树。如果你想了解有关该主题的更多信息,我建议阅读比特币白皮书原著,并跟着比特币维基和andreas antonopoulos的优秀书籍学习:掌握比特币:编程开放区块链。
原文链接:
http://adilmoujahid/posts/2018/03/intro-blockchain-bitcoin-python/?utm_source=wanqu.co&utm_campaign=wanqu+daily&utm_medium=website