{"id":13632112,"url":"https://github.com/csunny/py-bitcoin","last_synced_at":"2025-04-07T13:08:27.909Z","repository":{"id":144260653,"uuid":"139199759","full_name":"csunny/py-bitcoin","owner":"csunny","description":"比特币的python简易实现，主要介绍比特币底层技术。如Base58编码、椭圆加密算法、MerkleTree、P2P对等网络、RPC通信、UTXO、虚拟机、DHT、DAG、链上数据的持久化存储等。","archived":false,"fork":false,"pushed_at":"2019-07-22T04:55:28.000Z","size":159,"stargazers_count":316,"open_issues_count":2,"forks_count":108,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-03-31T11:08:21.347Z","etag":null,"topics":["bitcoin","dag","dpos","merkletree","p2p-network","pos","pow","python3","utxo"],"latest_commit_sha":null,"homepage":"https://xiaozhuanlan.com/eosio","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/csunny.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-06-29T22:00:25.000Z","updated_at":"2025-03-02T12:30:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"e81d0c60-91ba-4cce-88b3-9afd3e8a0c5c","html_url":"https://github.com/csunny/py-bitcoin","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csunny%2Fpy-bitcoin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csunny%2Fpy-bitcoin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csunny%2Fpy-bitcoin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/csunny%2Fpy-bitcoin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/csunny","download_url":"https://codeload.github.com/csunny/py-bitcoin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247657281,"owners_count":20974345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitcoin","dag","dpos","merkletree","p2p-network","pos","pow","python3","utxo"],"created_at":"2024-08-01T22:02:52.042Z","updated_at":"2025-04-07T13:08:27.887Z","avatar_url":"https://github.com/csunny.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\n\u003ca href=\"https://travis-ci.org/csunny/py-bitcoin\"\u003e\u003cimg src=\"https://travis-ci.com/csunny/py-bitcoin.svg?branch=master\" /\u003e\u003c/a\u003e\n### 比特币项目的python简易实现，利用python实现一个完整的区块链项目\n\n注意: 本项目属于业余项目，并不打算完全实现bitcoin全部协议，甚至会加一些不同的地方，比如最近正在思考利用V8+llvm实现虚拟机，说这个是为什么呢？ 有些国人实在素质堪忧，上来就说不是完整实现，狂喷。 这里特别说明下，不伺候喷子，喷子请绕道吧！\n\n从零用python实现简易比特币项目， 写一个完整的区块链。\n\n- 加密算法的应用 (Base58)\n- p2p 网络\n- 区块链数据的持久化存储\n- 链上数据的查询\n- UTXO 模型实现\n- Mekletree \n- Wallet \u0026 Transaction\n\n\n\n#### 项目架构介绍\n\n**如下为整个项目的架构图。这里从下往上对下图依次做个说明**\n\n![架构图](https://github.com/csunny/py-bitcoin/blob/master/docs/resource/img/py-bitcoin.jpeg)\n\n\n**一、**  **Crypto** 此模块为BTC链中用到的密码学相关的内容，主要包括**Base58**、**hash**以及**椭圆加密**等算法。在区块链中一个非常核心的就是就是**加密技术**，所以**Crypto**在整个技术架构中是占据着一个相当重要的位置，是整个区块链技术的基石，承载着整个区块链项目的顺利运行。\n\n**二、**  **Net** 是区块链中的**对等网络**部分，也就是**P2P**（Peer-to-Peer）网络，区块链技术是一种去中心话的技术，区别于传统的中心化技术架构，其不是**B/S**（Brower/Server）也不是**C/S**（Client/Server）的模式，其各个节点之间是完全对等的，只不过对于不同的链来说，或者基于不同的共识算法，其节点所承担的角色有所差异。比如有些节点负责挖矿是矿工节点，有些节点负责是钱包轻节点(spv)，有些是全节点 **full node** （存储了完整的链数据）所以网络也是区块链中撑起整个技术架构的一个底层技术。\n\n**三、** **Storage 存储**，存储想必重要性不用讲大家也都非常清楚，但是在这里还是要啰嗦两句。 不管是在**中心化的互联网技术架构**或者是传统行业的技术架构或者任何其他人类从事的活动中，存储一直都是一个非常重要的话题。 大家都知道，人脑是最早的存储“设备”，人一开始没有发明记帐工具的时候，人脑就在担任此项功能，随着人类社会的发展与进步，人们存储知识的方式与手段越来越丰富，到目前主要以电子设备为主。 当然了，在区块链的世界里，存储也是一个逃不开的话题，甚至说，在**去中心化的架构**当中，存储是一个新的机遇与挑战。目前比特币链上的数据还不大，也主要有几种主流的存储方式，比如内存存储啊，k-v数据库存储啊，等等。 近年来，随着区块链技术的发展以及更多数据的产生与上链，新的存储方案也已经进入了大众的视角，其中最具有代表性的就是**IPFS**   \n\n**四、** 讲完了基础的部分，终于要进入到比特币的核心部分了，因为前面都是基础部分。首先我们从**BlockChain**开始，BlockChain，嗯，是的，这就是我们整个技术架构的主角，因为BlockChain就是区块链啊（哈哈，真是废话)。在**比特币白皮书**描述当中，为了能够实现去中介化的目的，也就是在没有第三方参与的情况下能够解决double-pay的问题，提出了两个非常重要的概念:\n- **区块链**\n- **POW**\n\n一条链其本质就是数据结构中的一个**链表**，上一个Node指向下一个Node，只不过在这个链表是一个特殊的链表，其设置不能被更改，是一个只能添加的链表。并且永远都只认最长的那一条链，其他链都为假，只有最长链是真。 \n\n正如图中所示，一个链中包含有很多信息。 首先一条链是由很多个**Block**组成，也就是具有很多个块，对应与链表中就是一个链表由很多个节点组成。 而这每个节点中又包含很多信息，最重要的四个信息就是**Timestramp（时间戳）**、**Hash（自己的hash值）**、**PrevHash（上一个块的Hash值）**、**Transactions（交易信息）**，这几个值都相当重要，非常重要，一定要牢记。 \n\n相信你也看到了**Transactions**我是写的复数，是的一个Block里面可能会包含很多个交易信息，这些交易信息也正是比特币能够用于支付、交易的主要原因。在比特币当中，交易主要由三个主要的信息组成：\n-  **输入**  \n-  **输出** \n-  **交易信息，交易值**\n \n说到这里，我们先暂停下，先来了解下**Address**，也就是**地址**。 在传统的金融领域，也就是目前我们使用的各个银行账号，或者支付宝账号，其都是**账户模型**，也就是说，一个人对应一个或者多个账号，是一种实名制的方式进行的，其数据完全由**第三方的中间机构**所掌握，也就是银行，我们因为相信银行的信用，所以我们不怕将我们的个人信息泄露给银行，也不是特别担心银行会将我们的个人信息泄露出去。 当然，随着人们对个人隐私意识的升级，以及银行等中间机构的强势，这种信任也出现了危机。\n\n我们回到比特币上来，在比特币里面采用的是前面提到的**椭圆加密的算法**，其用椭圆加密算法生成了公、私钥。也就是对应与我们银行账户的账户、密码。密码是有我们个人保管的，公钥匙公开的，谁都可以查到，包括这个账号里的钱啊、转账记录啊等等任何人都可以查到， 看到这里有些人估计要心里开始打鼓了，那既然我的账号是公开的，那么难道说我去个东莞、搞个嫩模也能被查到？ 准确来说，是的！但是这里有一个相当精妙的设计，那就是这个地址跟人其实是没有对应的，也就是说，别人能知道这个地址干了啥，却不能知道是你干的。（当然你如果把自己的地址+身份公开，那你赶紧准备跪搓衣板吧！） 哈哈，我知道，说完这个绝大多数人都松了一口气。\n\n说完地址，那我们继续接着聊上面的交易，其实每一笔交易的产生都是跟地址直接相关的，也可以说交易信息里面天然涵盖了交易地址，当然在比特币交易信息里面你可能看不到，因为这背后又是密码学的东西，这里不展开，总之你知道，你的每一笔交易都会跟你的地址直接相关，而且当你发生交易的时候都会触发**UTXO**（比特币里面独有的交易模型）来验证是否有足够的余额以及确认交易的顺利进行，这所有的东西组在一起就生成了一条比特币链。是不是觉得相当强大？ 嗯，更强大的还在后面。\n\n**五、** 重点来了，前面讲到交易的时候要用到**UTXO**，那么到底什么是**UTXO**？  **UTXO**是比特币特有的**交易模型**，防止你的交易出错，验证你的账号余额等一系列的事情，都是基于**UTXO**。**UTXO**的官方解释是：**Unspent Transaction output.** 怎么翻译可以自己查查字典，我觉得翻译过来比较怪，所以就直接**UTXO**了，那么**UTXO**怎么理解呢？ 前面有说在一个交易里面会有输入、输出。其实在每次交易的时候，都会去遍历整个链，去查找这个账号下的所有交易，然后将所有的输入、跟输出进行对比。如果还有剩余的输入，也就是说你还有钱没花出去，而且你发生交易的数额又正好小于或等于你剩余的支出，那么ok，你可以发生这笔交易，也就是你还有钱交易。否则，你就不能进行交易，就跟你没钱不能消费是一样的道理。\n\n当然**UTXO**的设计非常精美，其不同与我们日常所用的账户模型，不再是资产、负债表的那一套，是一个全新的概念，我认为相当惊艳。当然，你或许会讲，每一次交易都要重新查一遍我历史的所有交易，那岂不是很慢？ 嗯，我告诉你，当数据量很大的时候，是很慢。这一点比特币也想到了，所以他采用了**chainstate** 我这里叫**状态机**来保存账户的历史交易状态，这样就避免了每次都要遍历整个链，极大的提高了效率。\n\n**六、** **POW** 前面提到为了实现去中心化的目的，比特币提出了两个核心的概念，一个是链、另一个就是共识算法**POW**（proof-of-work）工作量证明算法，简单理解就是谁干的活最多，谁来记账，将区块的交易信息写到链条上。**POW**算法，是目前最为成熟的算法，正是因为**POW**，造就了**挖矿**行业，也让我国的半导体芯片行业有了十足的进步。如果非要说我们在半导体领域里面跑在最前面的是什么？那我一定会说是**矿机**。\n\n**七、** **RPC**作为分布式系统之间的一种通信方式，没有什么特别要说的。 \n\n**八、** **API**层就是整个系统暴露在外面的部分，是外部与系统进行通信的窗口。\n\n\n\n#### 总结\n看似简简单单的一张图，讲了大半天，还感觉没讲很完整，里面还有很多内容需要阐述、需要挖掘，这也正从侧面说明了比特币整个系统的强大，看似简单的系统里面，包含了太多的东西。 需要我们慢慢去挖掘，去吃透。 架构的部分就简单讲到这里，既然这是一个系列的教程，同时代码又是会开源出来的，那么就很有必要在这里贴一下，整个项目的代码组织架构，毕竟，talk is cheap， show me the code 是我们的遵旨。\n\n\n#### 文档\n- [专栏文档](https://xiaozhuanlan.com/eosio)\n\n- 经济机器是什么运作的 [中文](https://v.qq.com/x/page/n0515obtcil.html) [英文](https://www.youtube.com/watch?v=PHe0bXAIuk0)  （有助于理解比特币UTXO交易模型）\n\n\n#### Licence\n\npy-bitcoin code is licensed under the GNU GENERAL PUBLIC LICENSE  Version 3, 29 June 2007 (https://github.com/csunny/py-bitcoin/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsunny%2Fpy-bitcoin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcsunny%2Fpy-bitcoin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcsunny%2Fpy-bitcoin/lists"}