Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/csunny/py-bitcoin

比特币的python简易实现,主要介绍比特币底层技术。如Base58编码、椭圆加密算法、MerkleTree、P2P对等网络、RPC通信、UTXO、虚拟机、DHT、DAG、链上数据的持久化存储等。
https://github.com/csunny/py-bitcoin

bitcoin dag dpos merkletree p2p-network pos pow python3 utxo

Last synced: 5 days ago
JSON representation

比特币的python简易实现,主要介绍比特币底层技术。如Base58编码、椭圆加密算法、MerkleTree、P2P对等网络、RPC通信、UTXO、虚拟机、DHT、DAG、链上数据的持久化存储等。

Awesome Lists containing this project

README

        


### 比特币项目的python简易实现,利用python实现一个完整的区块链项目

注意: 本项目属于业余项目,并不打算完全实现bitcoin全部协议,甚至会加一些不同的地方,比如最近正在思考利用V8+llvm实现虚拟机,说这个是为什么呢? 有些国人实在素质堪忧,上来就说不是完整实现,狂喷。 这里特别说明下,不伺候喷子,喷子请绕道吧!

从零用python实现简易比特币项目, 写一个完整的区块链。

- 加密算法的应用 (Base58)
- p2p 网络
- 区块链数据的持久化存储
- 链上数据的查询
- UTXO 模型实现
- Mekletree
- Wallet & Transaction

#### 项目架构介绍

**如下为整个项目的架构图。这里从下往上对下图依次做个说明**

![架构图](https://github.com/csunny/py-bitcoin/blob/master/docs/resource/img/py-bitcoin.jpeg)

**一、** **Crypto** 此模块为BTC链中用到的密码学相关的内容,主要包括**Base58**、**hash**以及**椭圆加密**等算法。在区块链中一个非常核心的就是就是**加密技术**,所以**Crypto**在整个技术架构中是占据着一个相当重要的位置,是整个区块链技术的基石,承载着整个区块链项目的顺利运行。

**二、** **Net** 是区块链中的**对等网络**部分,也就是**P2P**(Peer-to-Peer)网络,区块链技术是一种去中心话的技术,区别于传统的中心化技术架构,其不是**B/S**(Brower/Server)也不是**C/S**(Client/Server)的模式,其各个节点之间是完全对等的,只不过对于不同的链来说,或者基于不同的共识算法,其节点所承担的角色有所差异。比如有些节点负责挖矿是矿工节点,有些节点负责是钱包轻节点(spv),有些是全节点 **full node** (存储了完整的链数据)所以网络也是区块链中撑起整个技术架构的一个底层技术。

**三、** **Storage 存储**,存储想必重要性不用讲大家也都非常清楚,但是在这里还是要啰嗦两句。 不管是在**中心化的互联网技术架构**或者是传统行业的技术架构或者任何其他人类从事的活动中,存储一直都是一个非常重要的话题。 大家都知道,人脑是最早的存储“设备”,人一开始没有发明记帐工具的时候,人脑就在担任此项功能,随着人类社会的发展与进步,人们存储知识的方式与手段越来越丰富,到目前主要以电子设备为主。 当然了,在区块链的世界里,存储也是一个逃不开的话题,甚至说,在**去中心化的架构**当中,存储是一个新的机遇与挑战。目前比特币链上的数据还不大,也主要有几种主流的存储方式,比如内存存储啊,k-v数据库存储啊,等等。 近年来,随着区块链技术的发展以及更多数据的产生与上链,新的存储方案也已经进入了大众的视角,其中最具有代表性的就是**IPFS**

**四、** 讲完了基础的部分,终于要进入到比特币的核心部分了,因为前面都是基础部分。首先我们从**BlockChain**开始,BlockChain,嗯,是的,这就是我们整个技术架构的主角,因为BlockChain就是区块链啊(哈哈,真是废话)。在**比特币白皮书**描述当中,为了能够实现去中介化的目的,也就是在没有第三方参与的情况下能够解决double-pay的问题,提出了两个非常重要的概念:
- **区块链**
- **POW**

一条链其本质就是数据结构中的一个**链表**,上一个Node指向下一个Node,只不过在这个链表是一个特殊的链表,其设置不能被更改,是一个只能添加的链表。并且永远都只认最长的那一条链,其他链都为假,只有最长链是真。

正如图中所示,一个链中包含有很多信息。 首先一条链是由很多个**Block**组成,也就是具有很多个块,对应与链表中就是一个链表由很多个节点组成。 而这每个节点中又包含很多信息,最重要的四个信息就是**Timestramp(时间戳)**、**Hash(自己的hash值)**、**PrevHash(上一个块的Hash值)**、**Transactions(交易信息)**,这几个值都相当重要,非常重要,一定要牢记。

相信你也看到了**Transactions**我是写的复数,是的一个Block里面可能会包含很多个交易信息,这些交易信息也正是比特币能够用于支付、交易的主要原因。在比特币当中,交易主要由三个主要的信息组成:
- **输入**
- **输出**
- **交易信息,交易值**

说到这里,我们先暂停下,先来了解下**Address**,也就是**地址**。 在传统的金融领域,也就是目前我们使用的各个银行账号,或者支付宝账号,其都是**账户模型**,也就是说,一个人对应一个或者多个账号,是一种实名制的方式进行的,其数据完全由**第三方的中间机构**所掌握,也就是银行,我们因为相信银行的信用,所以我们不怕将我们的个人信息泄露给银行,也不是特别担心银行会将我们的个人信息泄露出去。 当然,随着人们对个人隐私意识的升级,以及银行等中间机构的强势,这种信任也出现了危机。

我们回到比特币上来,在比特币里面采用的是前面提到的**椭圆加密的算法**,其用椭圆加密算法生成了公、私钥。也就是对应与我们银行账户的账户、密码。密码是有我们个人保管的,公钥匙公开的,谁都可以查到,包括这个账号里的钱啊、转账记录啊等等任何人都可以查到, 看到这里有些人估计要心里开始打鼓了,那既然我的账号是公开的,那么难道说我去个东莞、搞个嫩模也能被查到? 准确来说,是的!但是这里有一个相当精妙的设计,那就是这个地址跟人其实是没有对应的,也就是说,别人能知道这个地址干了啥,却不能知道是你干的。(当然你如果把自己的地址+身份公开,那你赶紧准备跪搓衣板吧!) 哈哈,我知道,说完这个绝大多数人都松了一口气。

说完地址,那我们继续接着聊上面的交易,其实每一笔交易的产生都是跟地址直接相关的,也可以说交易信息里面天然涵盖了交易地址,当然在比特币交易信息里面你可能看不到,因为这背后又是密码学的东西,这里不展开,总之你知道,你的每一笔交易都会跟你的地址直接相关,而且当你发生交易的时候都会触发**UTXO**(比特币里面独有的交易模型)来验证是否有足够的余额以及确认交易的顺利进行,这所有的东西组在一起就生成了一条比特币链。是不是觉得相当强大? 嗯,更强大的还在后面。

**五、** 重点来了,前面讲到交易的时候要用到**UTXO**,那么到底什么是**UTXO**? **UTXO**是比特币特有的**交易模型**,防止你的交易出错,验证你的账号余额等一系列的事情,都是基于**UTXO**。**UTXO**的官方解释是:**Unspent Transaction output.** 怎么翻译可以自己查查字典,我觉得翻译过来比较怪,所以就直接**UTXO**了,那么**UTXO**怎么理解呢? 前面有说在一个交易里面会有输入、输出。其实在每次交易的时候,都会去遍历整个链,去查找这个账号下的所有交易,然后将所有的输入、跟输出进行对比。如果还有剩余的输入,也就是说你还有钱没花出去,而且你发生交易的数额又正好小于或等于你剩余的支出,那么ok,你可以发生这笔交易,也就是你还有钱交易。否则,你就不能进行交易,就跟你没钱不能消费是一样的道理。

当然**UTXO**的设计非常精美,其不同与我们日常所用的账户模型,不再是资产、负债表的那一套,是一个全新的概念,我认为相当惊艳。当然,你或许会讲,每一次交易都要重新查一遍我历史的所有交易,那岂不是很慢? 嗯,我告诉你,当数据量很大的时候,是很慢。这一点比特币也想到了,所以他采用了**chainstate** 我这里叫**状态机**来保存账户的历史交易状态,这样就避免了每次都要遍历整个链,极大的提高了效率。

**六、** **POW** 前面提到为了实现去中心化的目的,比特币提出了两个核心的概念,一个是链、另一个就是共识算法**POW**(proof-of-work)工作量证明算法,简单理解就是谁干的活最多,谁来记账,将区块的交易信息写到链条上。**POW**算法,是目前最为成熟的算法,正是因为**POW**,造就了**挖矿**行业,也让我国的半导体芯片行业有了十足的进步。如果非要说我们在半导体领域里面跑在最前面的是什么?那我一定会说是**矿机**。

**七、** **RPC**作为分布式系统之间的一种通信方式,没有什么特别要说的。

**八、** **API**层就是整个系统暴露在外面的部分,是外部与系统进行通信的窗口。

#### 总结
看似简简单单的一张图,讲了大半天,还感觉没讲很完整,里面还有很多内容需要阐述、需要挖掘,这也正从侧面说明了比特币整个系统的强大,看似简单的系统里面,包含了太多的东西。 需要我们慢慢去挖掘,去吃透。 架构的部分就简单讲到这里,既然这是一个系列的教程,同时代码又是会开源出来的,那么就很有必要在这里贴一下,整个项目的代码组织架构,毕竟,talk is cheap, show me the code 是我们的遵旨。

#### 文档
- [专栏文档](https://xiaozhuanlan.com/eosio)

- 经济机器是什么运作的 [中文](https://v.qq.com/x/page/n0515obtcil.html) [英文](https://www.youtube.com/watch?v=PHe0bXAIuk0) (有助于理解比特币UTXO交易模型)

#### Licence

py-bitcoin code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 (https://github.com/csunny/py-bitcoin/blob/master/LICENSE)