手把手教你用Python开发区块链:代码实战教程

张开发
2026/4/8 2:49:46 15 分钟阅读

分享文章

手把手教你用Python开发区块链:代码实战教程
区块链基础原理 Python简易实现教程一、区块链核心基础认知1.1 区块链定义区块链是一种分布式账本技术可理解为多个节点共同维护的公开账本。核心三大特性去中心化无单一管控方全网节点共同记账维护不可篡改密码学哈希链式绑定历史数据无法私自修改公开透明交易记录全网可查全程可溯源所有交易会打包生成「区块」区块通过哈希值首尾串联形成「链」每个区块保存上一区块哈希从底层保障数据完整性与防篡改能力。1.2 核心应用场景无需第三方信任中介即可实现陌生人安全协作典型场景金融交易、供应链溯源、政务投票、存证确权等。二、区块链底层运行原理2.1 完整运行流程发起交易账本参与者产生转账/数据变更触发账本状态更新打包区块汇总一段时间内所有有效交易整合生成新区块链式存储区块按时间顺序串联形成永久日志最新区块代表账本当前最新状态2.2 账号体系公私钥机制公钥区块链公开账号对外收款、身份标识私钥区块链专属密码掌控资产、签名授权对比传统中心化账号传统账号密码存中心数据库存在管理员作恶、黑客盗库风险区块链私钥随机生成通过椭圆加密曲线算法推导公钥依靠数学关系完成身份验证无中心化数据库依赖2.3 矿工记账节点工作流程收集交易从全网交易池抓取待确认合法交易组装新区块算力解谜调整区块随机数Nonce反复计算区块哈希满足全网难度要求全网广播算出合法区块后同步发送至所有网络节点节点验证全网节点校验交易合规性、杜绝双花攻击共识上链多数节点验证通过区块永久写入区块链挖矿奖励系统自动发放代币交易手续费给记账矿工三、Python 简易区块链代码实现3.1 环境准备3.1.1 数据库依赖采用 CouchDB 存储区块数据下载地址https://couchdb.apache.org/#download本地访问地址http://127.0.0.1:5984/_utils3.1.2 依赖库安装# CouchDB数据库操作pipinstallcouchdb# 椭圆曲线加密算法公私钥pipinstallecdsa# 全网时间同步pipinstallntplib3.2 通用工具函数时间统一utils/helpers.pyfromdatetimeimportdatetime,timezoneimportntplib# NTP协议获取全球统一标准时间defget_ntp_time(serverpool.ntp.org,timeout5)-datetime:clientntplib.NTPClient()responseclient.request(server,version3,timeouttimeout)# 转换为UTC标准时间returndatetime.fromtimestamp(response.tx_time,tztimezone.utc)3.3 核心层区块与区块链定义3.3.1 区块结构定义core/block.pyimporthashlibimportjsonfromtypingimportDict,ListclassBlock:def__init__(self,index:int,timestamp:float,transactions:List[Dict],previous_hash:str,nonce:int0):self.indexindex self.timestamptimestamp self.transactionstransactions self.previous_hashprevious_hash self.noncenonce self.hashself.compute_hash()# 计算区块SHA256哈希值defcompute_hash(self)-str:block_data{index:self.index,timestamp:self.timestamp,transactions:self.transactions,previous_hash:self.previous_hash,nonce:self.nonce}returnhashlib.sha256(json.dumps(block_data,sort_keysTrue).encode()).hexdigest()# 转为字典入库专用defto_dict(self)-Dict:return{_id:self.hash,index:self.index,timestamp:self.timestamp,transactions:self.transactions,previous_hash:self.previous_hash,nonce:self.nonce,hash:self.hash}# 字典还原区块对象classmethoddeffrom_dict(cls,data:Dict)-Block:returncls(indexdata[index],timestampdata[timestamp],transactionsdata[transactions],previous_hashdata[previous_hash],noncedata[nonce])3.3.2 区块链主逻辑记账挖矿core/blockchain.pyfromutilsimporthelpersfrom.blockimportBlockfromprotocol.couchdb_clientimportCouchDBClientclassBlockchain:def__init__(self):self.couchCouchDBClient()self.pending_transactions[]# 待打包交易池self.difficulty4# 挖矿难度self.chainself.load_chain()# 加载本地链无数据则创建创世区块defload_chain(self):chain_dataself.couch.get_all_blocks()ifnotchain_data:self.create_genesis_block()return[Block.from_dict(self.couch.get_latest_block())]return[Block.from_dict(b)forbinchain_data]# 创建区块链第一个区块创世区块defcreate_genesis_block(self):genesisBlock(0,helpers.get_ntp_time().timestamp(),[],0)self.couch.save_block(genesis.to_dict())# 添加待确认交易defadd_transaction(self,transaction:dict):self.pending_transactions.append(transaction)# 查询全量区块defget_all_blocks(self):returnself.couch.get_all_blocks()# 挖矿打包区块defmine_block(self,miner_address:str):# 1. 复制待打包交易transactions_to_mineself.pending_transactions.copy()# 2. 添加矿工奖励交易transactions_to_mine.insert(0,{sender:system,recipient:miner_address,amount:1.0,timestamp:helpers.get_ntp_time().timestamp()})# 3. 生成新区块new_blockBlock(indexlen(self.chain),timestamphelpers.get_ntp_time().timestamp(),transactionstransactions_to_mine,previous_hashself.chain[-1].hash)new_block.nonce1new_block.hashnew_block.compute_hash()self.chain.append(new_block)self.couch.sync_chain(self.chain)# 清空交易池self.pending_transactions[]3.4 协议层CouchDB 数据持久化protocol/couchdb_client.pyimportcouchdbclassCouchDBClient:def__init__(self):self.useradminself.password123456self.hostlocalhostself.port5984dsnfhttp://{self.user}:{self.password}{self.host}:{self.port}self.servercouchdb.Server(dsn)# 自动创建区块链数据库self.db_nameblockchainifself.db_namenotinself.server:self.dbself.server.create(self.db_name)else:self.dbself.server[self.db_name]# 保存单个区块defsave_block(self,block_data:dict):block_idblock_data[hash]try:self.db[block_id]block_dataexceptcouchdb.http.ResourceConflict:pass# 获取所有区块defget_all_blocks(self):return[self.db[block_id]forblock_idinself.db]# 获取最新区块defget_latest_block(self):all_blocksself.get_all_blocks()returnmax(all_blocks,keylambdax:x[index])ifall_blockselseNone# 全量同步区块链数据defsync_chain(self,chain_data:list):try:# 清空旧数据fordoc_idinself.db:delself.db[doc_id]# 批量写入新链forblockinchain_data:self.db.save(block.to_dict())exceptExceptionase:print(fChain sync failed:{str(e)})3.5 应用层钱包 公私钥 交易签名app/wallet.pyfromecdsaimportSigningKey,VerifyingKey,SECP256k1importhashlibimportjsonfromutilsimporthelpers# 钱包类生成公私钥、地址、签名classWallet:def__init__(self):# 比特币同款SECP256k1椭圆曲线self.private_keySigningKey.generate(curveSECP256k1)self.public_keyself.private_key.get_verifying_key()self.addressself.generate_address()# 生成钱包收款地址defgenerate_address(self)-str:pubkey_hashhashlib.sha3_256(self.public_key.to_string(compressed)).digest()returnpubkey_hash[-20:].hex()# 私钥签名交易defsign_transaction(self,transaction:dict)-str:tx_datajson.dumps(transaction,sort_keysTrue).encode()signatureself.private_key.sign(tx_data)returnsignature.hex()# 公钥验证交易签名staticmethoddefverify_transaction(transaction:dict,signature:str)-bool:try:vkVerifyingKey.from_string(bytes.fromhex(transaction[sender_public_key]),curveSECP256k1)returnvk.verify(bytes.fromhex(signature),json.dumps(transaction,sort_keysTrue).encode())except:returnFalse# 交易创建工具类classTransaction:staticmethoddefcreate(sender_wallet:Wallet,recipient:str,amount:float)-dict:tx{sender:sender_wallet.address,sender_public_key:sender_wallet.public_key.to_string(compressed).hex(),recipient:recipient,amount:amount,timestamp:helpers.get_ntp_time().timestamp()}tx[signature]sender_wallet.sign_transaction(tx)returntx3.6 主程序完整测试运行main.pyfromapp.walletimportWallet,Transactionfromcore.blockchainimportBlockchain# 1. 创建三类钱包发起方、接收方、矿工senderWallet()receiverWallet()recorderWallet()# 2. 初始化区块链自动生成创世区块chainBlockchain()# 3. 创建转账交易发起人转10个代币给接收人txTransaction.create(sender,receiver.address,10)chain.add_transaction(tx)# 4. 矿工打包区块、上链记账chain.mine_block(recorder.address)# 5. 输出全量区块数据print(chain.get_all_blocks())3.7 运行说明执行命令python main.py运行结果自动生成创世区块区块链初始区块生成转账交易区块包含转账记录 矿工挖矿奖励所有区块持久化存入 CouchDB 数据库四、总结拓展本项目为单机模拟版区块链未实现P2P全网广播、完整共识算力竞赛仅适合入门理解底层逻辑以太坊发币底层依托区块链智能合约需先吃透本案例区块结构、公私钥签名、交易打包、哈希防篡改进阶方向接入P2P网络、实现PoW/PoS完整共识、开发智能合约、对接以太坊主网发行代币行业趋势区块链将结合AI大模型、物联网实现可信数据协作侧链、分片、零知识证明可大幅提升性能与隐私性

更多文章