比特币基础知识
基础
比特币特性
硬通货
跨境交易
易携带
只需一个私钥
私密性
- 只暴露钱包地址
- 非法应用
无货币超发
通货紧缩
- 去中心化,P2P分布式的数字货币系统
- 共识机制 - POW工作量证明
- 非对称密码学,公钥私钥
- 区块链作为账本
简单理解
比特币就是UTXO,
交易UTXO + 区块链 = 比特币系统
POW共识机制
proof of work
通过挖矿保证我是个善意的节点,并获得生成区块,和在这个区块里记账的权利
区块的生成和连接
- 比特币由挖矿而产生,通过计算出一个算计数字nonce
- 生成的BTC被记录在矿工名下,通过矿工的公钥的哈希值锁定
- 交易的输出被称为UTXO,unspent transaction output,未花费交易
- 比特币钱包余额就是根据众多UTXO计算出来的
- 新区块通过包含前一个区块头部的哈希值建立链接关系。
- 区块链有时会产生临时的分叉而生成两条链,最终较短的链将被舍弃
UTXO的生成和销毁
交易包含三项,
- 交易的输入,UTXO指针
- 交易的输出,UTXO
- 解锁脚本,私钥签名,公钥
比特币架构
比特币前端
钱包
保存用户的私钥数据库,管理用户余额,提供比特币交易(支付、转账)。
签名、钱包加密、备份、密钥导入、导出。
钱包分为两种,非决定性和决定性的。决定性(deterministic)指的是私钥是否有种子生成。
非决定性钱包: 直接保存私钥,私钥数据保存在Berkeley DB上。安全性不高。比特币核心带有一个非决定性钱包,不推荐使用。
决定性钱包: 所有私钥都由一个私钥种子(Seed)通过单向哈希算法生成。通过种子生成私钥,因此备份容易。又分为普通决定性钱包和层级决定性钱包。
根据部署场景分为,移动钱包,桌面钱包,互联网钱包以及纸钱包。
- 移动钱包就是移动端的钱包,因为资源有限,多数采用SPV来验证交易。
- 桌面钱包分厚钱包Thick Wallet和薄钱包Thin Wallet。厚钱包下载整条区块链,进行完整的交易校验。比特币核心Bitcoin Core就是厚钱包。提供完整的钱包功能。厚钱包安全性高,交易开销大,适合大额交易。薄钱包灵活性高,安全性不高,适合小额交易
- 互联网钱包。依托第三方平台提供对用户隐私的保护,使用灵活,安全性不高。
- 纸钱包,字面意思
HTTP/JSON RPC API
API,给外部提供查询余额,支付和转账的接口
命令行工具bitcoin-cli
基于API开发的命令行工具
比特币浏览器bx
比命令行工具更强大的工具
图形开发工具Qt
比特币核心是Qt开发的,是比特币使用最广的客户端
比特币节点后端
比特币节点后台负责参与比特币网络的通信互联,维护区块链,验证区块、交易,广播、转播传递区块交易信息。比特币后台主要是bitcoind,以及挖矿节点程序。比特币核心bitcoin-qt实际上是包含前后端的一体化节点(挖矿功能除外)。
区块链管理
区块链管理涉及初始区块链下载、连接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。
- 下载区块链,先下区块头,再并发下载区块体
- 接收区块链,节点在开始时将整个区块链的索引从LevelDB调进内存。索引不是单跳的链,在末端可能会形成树,因为会分叉。这一步将新的加点加入树的末梢。
- 区块链验证,这一步比较复杂,验证完之后,新的区块就被加入到这个节点的链中了
- 重组区块链,节点发现一条更长的链会断开重组。会更改UTXO,被断开的区块中交易会会退到交易内存池(mempool),用回滚记录来断开区块中的交易
区块验证
比特币的一个很大的创新是依靠脚本来验证交易的合法性,即每一个将要花掉的比特币必须有相应的来源。
脚本是基于堆栈的一些命令。
内存池管理
mempool也就是交易池管理。节点将通过验证的交易放在一个交易池中,准备放在一个挖到的区块中。当矿工挖到一个合格的区块后,他将按一定的优先级从交易池中选出交易放到区块中。优先级按UTXO的链龄和交易额的大小来划分。当区块填满后,剩下的交易会留在内存池。
内存池的交易不保存在硬盘上,当挖矿节点重启时,内存池的交易会被清空。如果在一定时间内一个交易一直不能被矿工包括在区块链上,钱包软件需要重新发送该交易,并附上较高的交易费。
邻节点管理
当一个新节点做初始启动(bootstrap)的时候,它需要发现网络中的其他节点,并与至少一个节点连接。一般是与一个已知的节点在8333端口建立TCP连接。连接的握手流程发送一个版本信息。对方回复确认消息。
发现邻节点的方法。
比特币中广义的共识管理(consensus)包括挖矿、区块验证和交易验证规则。但这些功能实现分散在不同的程序中。社区在尝试将其独立。
比特币的共识管理必须向前兼容,即使过去有bug也要保持,否则比特币网络会出现分叉。
规则管理
比特币的共识规则是所有节点都必须遵守的规则。而每个节点可以采用一些共识规则以外的个性化规则。这部分的规则有规则管理模块实现。比如一个节点可以拒绝保存、中转大于200KB的交易。另外像对交易费用的一些规则。也可以通过规则模块来管理
密码模块
crypto模块主要是处理比特币地址。
私钥产生公钥。公钥经过几步产生地址
- SHA256哈希处理
- RIPEMD160哈希处理得到一个160位的结果
- Base58Check编码
Base58Check的校验码对地址信息进行双重SHA256哈希处理,并取前4位做校验码,加载比特币地址的后面,因此比特币地址带有校验信息,可以防止人为错误
签名模块
比特币采用椭圆曲线数字签名算法(ECDSA)来实现数字签名及生成公钥。这是一种非对称加密算法,是基于椭圆曲线离散对数问题的计算困难性的一种公钥密码的方法。
secp256k1曲线比其他曲线具有更高的性能。
脚本引擎
基于堆栈的运算平台,非图灵完备。不能跳转,只能执行一次。
这样设计是不希望矿工有能力提交一个可能有死循环的脚本。
比特币作为一个虚拟货币系统,这样的设计已经足够。
挖矿
中本聪当初设计比特币的目标是建立一个完全去中心化的虚拟货币,采用一个CPU一票的理念。后面的矿池是他没有预料到的。
CPU>GPU>FPCA>ASIC
HTTP/JSON RPC 服务端
提供接口来控制比特币节点
Berkeley DB和LevelDB数据库
Berkeley DB做钱包数据库,这是一个开源的文件数据库。介于关系数据库和内存数据库之间。比特币的数据作为文件类型放在硬盘上。
LevelDB用来存储区块的索引和UTXO记录。它是KV数据库。它的数据是冗余数据,可以用原始区块链数据来重建,但是非常慢。
P2P网络管理
在P2P网络上实现和其他邻接点的通信功能
ZMQ队列管理
采用Zero MQ作为消息队列管理和消息分发工具。这是一个简单好用的传输层,提供像框架一样的一个socket library,是个socket编程更加简单。
文章标题:比特币基础知识
本文作者:Benny
发布时间:2020-06-08, 19:49:33
最后更新:2018-06-29, 18:34:40
原始链接:https://benny233.github.io/2020/06/08/比特币/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。