比特币简介
比特币的诞生:
1 | | 1977年 |货币非国有化主张 |
比特币白皮书:比特币₿白皮书 BTCpapers.com《比特币:一种点对点的电子现金系统
本质:一套管钱的账本
比特币系统的工作原理
比特币面临的挑战?
- 为什么要动用自己的计算机资源来存储这些信息呢??
- 以谁的记录为准??
- 比特币如何做到支付功能??
- 比特币如何防伪??
- 比特币如何防篡改??
- 比特币如何防双重支付??
比特币交易流程:
1 | Alice打开他的钱包--> |
比特币钱包
本质:
- 比特币钱包是用来存放比特币地址和数字密钥的(地址相当于银行卡卡号;密钥相当于银行卡密码)
- 比特币的所有权是通过数字密钥,比特币地址和数字签名确立的
- 密钥相当于银行卡密码;地址相当于银行卡卡号
分类:
- 热钱包:在线钱包
- 冷钱包:离线钱包
支付相关:
- 比特币私钥主要用于用户接收支付,公钥用于别人来验证
- 支付比特币时,比特币的当前拥有者需要在交易中提交其签名和公钥
- 比特币地址用于接收比特币,私钥用于比特币支付时进行交易签名
- 每个输入都是提供比特币的交易和地址;每个输出是接收比特币的地址,以及发送到该地址的比特币数量
比特币地址生成 :
1 | 随机函数-->私钥--(椭圆曲线)-->公钥--(系列哈希其他处理)-->比特币地址 |
脚本:
- 解锁脚本:由其他人提供,用以解决”障碍”
- 锁定脚本:存在于一笔交易输出中,如果要使用输出,锁定脚本时必须被满足的”障碍”
双花问题
定义:
“双花”即双重支付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况重要性:
“双花”是任何一种数字货币都要解决的问题比特币解决方式:
未花费交易输出(UTXO)
1
2
3
4
5
61.定义:UTXO是一个包含交易数据和执行代码的数据结构,可以理解未收到但尚未花费的交易清单
2.普遍性:比特币系统中记录着当前每一笔"UTXO"
3.优点:
a.不能被分割,只能被消耗,大大减少计算量
b.配合地址使用,具备天然匿名性,保护了账户安全
c.由于地址存在,UTXO销毁和产生,都可追溯,很难伪造时间戳
1
2
31.定义:从格林威治时间1970年01月01日00时00分00秒起,至现在的总秒数,唯一标识区块数据的写入时刻
2.作用:时间戳是一个能表示一份数据在某个特定时间已经存在的,完整的,可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间
3.普遍性:时间戳保证每个区块按时间顺序连成区块链,时间戳也为区块链上每一笔数据打上时间标记(类似物品上的生产日期)解决双花的两种问题
1
2
3
41.第一笔交易已经入块,第二笔交易还未入块
a.解决思路:每笔交易都需要先确认对应比特币之前的状态,如果它之前已经被标记为花掉,那么新的交易会被拒绝
2.第一笔交易还未入块,第二笔交易也未入块
b.解决思路:正常情况下,节点会确认先接收到的那一个交易,另外一个交易会被拒绝;如果被不同节点确认,区块链将会发生分叉,剩余节点会选取最长的链上构建新的区块,当其中一笔交易被6个节点确认后,可以认为这笔交易获得了最终的确认
比特币数据结构
区块链的存储结构:
- 定义:连接了父区块和子区块,每一个区块分为区块头和区块体
区块头
作用:主要用来存储本区块的一些相关属性
组成:
本区块哈希值:
定义:H(n),包含父区块与本区块全部交易信息的DNA
系统版本号
父区块哈希值
时间戳:
定义:从格林威治时间1970年01月01日00时00分00秒起,至现在的总秒数,唯一标识区块数据的写入时刻
随机值:
定义:挖矿参数H(随机数)=hash(版本号+父区块哈希值+默克尔值+时间戳+时间数)
默克尔树:
结构:交易的哈希生成唯一的默克尔树
应用:
a.快速比较大量数据
b.快速定位修改
c.快速检索防伪
d.零知识证明
挖矿难度:
新难度=旧难度*(2016*10min)/过去2016个区块生成总时间
区块体:
- 定义:用来存储真实的交易数据记录的存储结构
比特币交易签名及验证
比特币验证:
- 账号所有权验证:如何在不泄露密码的前提下,证明自己对某个账户的所有权?
- 比特币所有权验证:如何在不泄露密码的前提下,证明自己对要交易的比特币的所有权?
- 交易所有权验证:如何在不泄露密码的前提下,证明某个交易的确时你创建的呢?
- 解决方法:在去中心化的前提下,每个节点独立进行验证
交易的构成:
- Input:计算花费的UTXO来源
- Output:计划生成几个UTXO,分别给谁
交易的签名
- 锁定脚本(scriptPubKey):放置在输出上面的花费条件,指定了今后花费这笔UTXO必须要满足的条件
- 解锁脚本(scriptSig):解锁脚本是一个满足被锁定脚本在一个输出上设定的花费条件的脚本
- 签名的输入:
- 代签名的交易数据
- 引用的UTXO相关信息:交易ID,序号,锁定脚本
- 支付者的公钥:<PriK(B)>
- 签名类型
- 签名的输出:
scriptSig(解锁脚本):签名(sig>)、支付者的公钥(<PubK(B)>)
交易签名的验证
- 交易验证目的:
- 签名验证的目的:
- 签名验证的方法:
比特币共识机制
区块链共识机制:
- 区块链共识算法
- 区块链共识规则
- 重要性:每个区块链都有自己精心设计好的规则性协议,这些协议通过共识算法来保证它们-可靠得以执行
比特币共识机制:
- 比特币共识算法:SHA256算法
- 比特币共识机制:工作量证明(Pow)
- 重要性:每一个节点必须要做一定的工作后才能赢得记账权,即工作量证明
- 独立打包–>交易优先级计算:交易优先级=交易UTXO的值*UTXO的块龄/交易大小(字节)
独立验证:挖矿过程这个过程使用的是SHA256哈希函数,挖矿节节点不断重复尝试,直到它找到的随机调整数使得产生的哈希值低于某个特定的目标 - 区块链的组装和选择:
- 孤块:
1
2
3
4
51.定义:如果节点收到了一个有效的区块,而在现有的区块链中却未找到它的父区块,那么这个区块被认为是"孤块"
出现情况:当两个区块在很短时间间隔内被挖出来,节点有可能会以相反的顺序接收到它们,这个时候孤块现象就会出现
2.分叉情况:
定义:
- 孤块:
比特币系统架构
比特币系统逻辑结构
应用层:
- 收付款
- 交易记录
- 区块查询
激励层:
- 发行机制
- 分配机制
共识层:
- 工作量证明(Pow)
网络层:
- P2P网络
- 传播机制
- 验证机制
数据层:
- 区块数据
- 链式结构
- 数字签名
- 哈希函数
- 默克尔树
- 非对称加密