主页 > imtoken下载链接 > 比特币base58源码分析_比特币交易详解(上)
比特币base58源码分析_比特币交易详解(上)
日本和中国是市场,对世界人民来说,聚集世界货物,贸易和回报,各有各的地方。 ——《周易·谢邪》
亚当·斯密及其《国富论》的核心见解是,交易双方都可以从交易中获利,只要交易是自愿的,没有互惠互利。没有成交。 - 米尔顿弗里德曼,“选择自由”
交易是比特币最重要的部分,比特币结构中的一切都是为了确保交易顺利进行并最终存储在区块链中。存在于区块链中。本文将详细介绍比特币交易。
(公元前3400年左右,美索不达米亚产生了楔形文字。这些写在泥板上的文字记录最多。信息是一个账户,也就是一笔交易。我国的伟大史书《史记》专门写了一个“商品传记》介绍如何做生意。)
比特币交易可以像传统的在线支付一样,支付到地址(P2PKH);还有“按脚本付费”(P2SH)——类似于智能合约,合约只有在满足一定条件时才会执行,大大扩展了比特币交易的灵活性。本文内容安排如下:
1比特币地址
1.1与支付宝对比
1.2地址类型和特征
1.3 地址生成
2.基本 P2PKH 交易
2.1 交易结构
2.2 事务生成
2.3次交易验证
2.4 交易传播和入块
3.比特币复杂交易
3.1 多脚本
3.2 P2SH(“Payment to script”,payment to script hash)交易
3.3 个时间锁
4.隔离见证
4. 1 什么是隔离见证
4.2 隔离见证交易与传统比特币交易的区别
比特币地址
比特币建立在密码学之上,主要涉及哈希函数、公钥密码学和数字签名。但令人惊讶的是,比特币中的密码学主要不是关于加密,而是关于证明所有权。在比特币中,节点之间传递的消息没有加密。相反,知道这些消息的节点越多越好。
1.1类似于支付宝
在生活中,如果你使用支付宝,你就会有一个支付宝账号和密码(password)。密码是用来证明所有权的,只有知道密码才能花账户里的钱。同样,比特币中使用数字签名来证明所有权。与传统账户对应的概念是“比特币地址”。
类别
支付对象
证明所有权
支付宝
帐户
密码
比特币
地址(由公钥或脚本生成)
数字签名(用私钥生成)
以上椭圆曲线密码学的公钥和私钥是椭圆曲线密码学中的概念,属于公钥密码学。公钥要向所有人公布,而私钥只有你自己知道。
数字签名类似于生活中的签名和公司印章的概念,只能用私钥生成。
如上表所写,比特币地址不止一个,有的是公钥生成的易经预测比特币,有的是脚本生成的,其中脚本是一个程序,可视为智能合约,当满足设定条件,合约自动执行。
1.2地址类型和特征
先给大家一个查询区块和交易的链接,让我们直观的看到什么是区块和交易。它是什么样的。打开链接后,搜索630000,这是比特币第三次减产后的第一个区块。查看交易,我们可以看到交易地址分为三种:
地址类型
名字
特点
费用
从 1 开始
支付公钥哈希地址(P2PKH)
原地址
高
从 3 开始
p>
支付脚本哈希 (P2SH)
可用于多重签名或segwit兼容地址
中等
以 bc1 开头
本地隔离见证地址 (P2WPKH/P2WSH)
可用于隔离见证
低
地址类型
名字
特点
费用
从 1 开始
支付公钥哈希地址(P2PKH)
最原始的地址
高
以 3 开头
支付脚本哈希 (P2SH)
可用于多重签名或segwit兼容地址
中等
以 bc1 开头
本地隔离见证地址 (P2WPKH/P2WSH)
可用于隔离见证
低
p开头的地址>
·1 最初由比特币使用。 P2PKH是通过公钥的哈希值Base58编码生成的:base58(hash160(公钥)),大多数交易所都可以使用。地址交易。
3开头的地址是Base58编码生成的脚本的hash值:base58(hash160(script))。 P2SH 的意思是“支付给匹配这个哈希的脚本,稍后花费输出时使用”。
脚本是一个程序,可以看作是一个智能合约。合同只有在满足设定条件时才有效。该脚本可以是多签交易:一个P2SH地址由3个人控制,其中任意2人同意发起转账。部分P2SH地址也兼容隔离认证。
·bc1开头的地址是通过bech32编码生成的,对应hash值。
P2WPKH 是 Bech32(hash160(公钥)); P2WSH 是 Bech32 (hash256 (hash256 (script))) 专用于隔离见证。只有少数交易所可以使用这种类型的地址。本文第 4 节详细介绍了 SegWit。
1.3 地址生成
比特币地址的形式有很多种,但都是通过公钥或脚本,哈希运算得到,然后进行编码,过程类似。我们以P2PKH地址为例,看看比特币地址是如何生成的。
P2PKH 地址由公钥生成。具体流程分为5个步骤:
①利用随机数生成器生成一个合适的随机数作为私钥k;
②利用椭圆曲线SECP256K1根据私钥k生成公钥K;
③对公钥K进行hash160运算得到公钥哈希hash160(K)=RIPEMD160(SHA256(K));
④在公钥哈希前加上版本号0X00,然后做两次SHA256运算,即SHA256(SHA256(0X00
公钥hash)),两次SHA256运算结果的前四个字节作为校验码;
⑤对“0X00+公钥哈希+前四字节校验码”进行Base58编码,得到P2PKH地址。
我们可以下载比特币核心程序并生成我们自己的比特币地址。此外,市场上有很多成熟的钱包软件。下载对应的钱包软件后,就可以轻松拥有自己的比特币地址了。
2.基本 P2PKH 交易
上一节介绍了比特币的地址。根据地址的类型,交易也不同:
· P2PKH地址类型的交易最简单(类似于普通支付宝转账),也是使用最多的。
·P2SH类型的交易是支付给脚本的交易(类似于智能合约,只有满足条件才能执行),有点复杂。
·P2WPKH/P2WSH地址交易,除了使用隔离见证之外,与P2PKH/P2SH地址交易有本质区别。
只有两种类型的交易:P2PKH地址类型交易和P2SH地址类型交易。本节介绍最简单的P2PKH地址类型交易,更复杂的P2SH地址类型交易放在第3节。
在本节中,我们首先直观的看一下最简单的 P2PKH 交易的结构,然后更详细地描述交易的生成和验证,最后简要说明交易的传播和进入区块。
2.1个交易结构
比特币交易由版本、输入、输出和锁定时间4部分组成。
·版本是指事务的版本号;
·输入是解释比特币的来源、解锁、证明使用权,包括四个参数;
·输出是指示比特币被转移和锁定给谁。只有能解锁的人才能消费,包括两个参数;
·锁定时间是指定交易的某个时间或区块高度不会被打包到之前的区块中,即在某个时间或区块高度之前不会被记录在比特币账本中。
比特币可以有多个输入和输出。比如买59元的东西,付钱的时候从钱包里拿出50加1块。张10元面值人民币(两次投入,50元和10元),找1元找零(两次输出,付给店家59元,付给自己1元)。输入输出参数的含义请参考上图及下节。
大家应该都发现了,在交易中:
·没有比特币地址(地址可以根据输出脚本中的哈希值计算出来);
·输入里面也没有比特币的数量(输入是另一笔交易的未花费输出,也称为UTXO,查找引用的交易就知道比特币输入的数量)。
这是设计的巧妙之处,只保留最重要的信息,其他信息可以从交易中给出的信息中计算或查询。后面我们再分别分析输出和输入,这些疑惑就可以迎刃而解了。
2.2 事务生成
比特币是全球公共账本,没有比特币实体,所有财富都隐藏在账本中,就像银行卡里的财富只是记录在银行账本中的一串数字。
所有的交易都记录在比特币账本上,每笔交易的hash值都是唯一的,并且以hash值作为id,这样每笔交易都有唯一的id,并且很容易知道id的目标是交易。交易 id=hash(交易)。
生成交易
假设张三需要支付李四0.03170599btc,这个过程应该如何进行?
①张三查账本,发现在输出1中交易41b...44c(txid=41b...44c, vout=1),王武给自己转账0.05262377btc.
②但是王舞做了一个锁脚本易经预测比特币,只有解决了自己锁脚本的问题才能花钱。但这对张三来说并不难,因为张三的私钥可以用来计算问题的答案。张三用自己的私钥针对王舞的加锁脚本制作了一个解锁脚本(scriptSig)。
③转给李四0.03170599btc,还要为这个输出做一个锁脚本,可以回答锁脚本(scriptPubKey),然后用这个0.03170599btc。这个锁脚本,李斯可以打开(或者需要指定1人以上才能打开,这个看李斯的要求)。
④0.05262377btc大于0.03170599btc,张三决定把0.02067716btc发给自己,我做了一个只有我能回答的锁脚本。剩下的0.00024062 btc不用管,记账员默认这部分是给自己打小费的。
⑤对交易进行检查后,将交易序列化并发送到比特币网络中与自身相连的节点。
其实我们只需要输入要转账的金额,还有李斯的比特币地址,钱包软件就会完成这些底层操作
上图右侧是张三转给李四的交易0.03170599btc;左边是报价的交易,张三要花的钱就是左边交易中王舞转给张三的钱。王舞的输入来自另一笔交易,可以在账本中找到。上图中的数据可以在630000块中搜索到,然后向下滚动到第18笔交易。
张三转给李四的交易0.03170599btc,相关参数如下:
·事务版本号
愿景=1
·交易的输入
txid=41...4c,钱来自交易41...4c;
vout=1,货币更具体地是从交易 4 输出 11...4c(输出从 0 开始计数);
scriptPubKey=4 7..ba,用于解锁交易4的锁脚本1...4c输出1;
sequence=0xffffffff,block Lock Time,交易立即生效。
·交易输出
输出 0:
value=0.02067716,把零钱转给自己;
scriptPubKey=OP_DUP ... OP_CHECKSIG,自己地址的锁脚本。
输出 1:
value=0.03170599,转入李斯的金额;
scriptPubKey=HASH160 ... OP_CHECKSIG,根据李四需要四个加锁脚本。
·锁定时间
LockTime=0,sequence的设置使LockTime失效。
总投入和总产出的差额默认为交易费,是对守账的矿工的奖励。输入输出中的脚本会在交易验证中说明,sequence和locktime属于时间锁的范畴。张三进行交易,确认无误后,发送给周边节点。
2.3次交易验证
每个节点收到其他节点的交易时,必须经过一系列的验证,验证通过后才会继续传播,否则直接丢弃。其他节点需要验证:
·报价交易中的比特币没有被花掉(是UTXO)--保证有钱可以花;
·投入不低于产出——保证花足够的钱;
·输入中的解锁脚本可以解锁参考交易输出中的锁定脚本——保证消费权;
·其他验证。
这些验证在继续转发之前已通过。我们主要关注解锁脚本可以解锁参考交易中对应的锁定脚本。
2.3.1 脚本组成
交易的输入输出都有脚本,分别是解锁脚本,锁定脚本,最简单的支付到P2PKH的脚本结构如下:
解锁脚本:scriptSig =
锁定脚本:scriptPubKey = 复制哈希 160 公钥哈希值等于校验数字签名
(1)>根据上一节中的交易,张三的解锁脚本修改
473044022067c48d2807966c960feeec2f19028165d6bd6dc68e6c43829d1d8ba899dba2360
22027c6296a001daf8bba85fea14c6ee5dec3c947efea5fd169422d2c04d74d82b0121023f
201d30514c3794d73a134fc6a5d6d05d16762d5f7e0c22f189eeea0afbdba
这是一个使用可分辨编码规则的序列化字节流。红色是=;蓝色是公钥的x坐标,y坐标很容易计算得到。
·0x30 表示 DER 序列的开始
·0x44 - 序列的长度(68字节)
·0x02 - 一个整数值
·0x20 - 整数的长度(32字节)
R-67c48d2807966c960feeec2f19028165d6bd6dc68e6c43829d1d8ba899dba236
0x02 - 一个整数
0x20 - 整数的长度(32 字节)
S-27c6296a001daf8bba85fea14c6ee5dec3c947efea5fd169422d2c04d74d82b
后缀(0x01)表示使用的哈希类型(SIGHASH_ALL)
0x21 - 序列长度(66 字节)
0x02 - 公钥是压缩格式,y坐标是偶数。
公钥x坐标:3f201d30514c3794d73a134fc6a5d6d05d16762d5f7e0c22f189eaeea0afbdba
(2)张三引用的未使用输出锁脚本为:
OP_DUP OP_HASH160 e1643ec0af21071e0f48b39b384cb5d1f49d1303
OP_EQUALVERIFY OP_CHECKSIG
对应含义:复制哈希160公钥哈希值等于校验数字签名
2.3.2个验证脚本
脚本验证需要将解锁脚本和锁定脚本合并,如下图所示:
比特币脚本语言本质上是一种堆栈语言。
比特币脚本中有元素(带尖括号)和运算符。元素可以看成是板块,算子是对元素的操作。脚本从左到右执行,元素像盘子一样放入桶(栈),后面放的元素(盘子)在最上面。当遇到一个操作符时,它对应一个作用于栈顶元素的操作。
DUP HASH160
EqualVERIFY CHECKSIG
上面的脚本有7个项目,执行分为7个步骤。具体流程如下图所示:
如果签名匹配上一步的公钥,CHECKSIG返回TRUE,验证通过。
2.4 区块交易的传播和记录
节点收到其他节点发送的交易后,经过验证后转发给周边节点。这就是泛洪算法,可以在很短的时间内用消息覆盖大部分网络。
交易传播
以一个不太合适的中心化软件微信为例(比特币网络是去中心化的):可以想象成一个新闻源,在朋友圈发消息,他的朋友看到后会自动转发,检查是否没有问题。很快大多数玩微信的人都会知道这个消息。
比特币全节点只有一万多个,85=32768,86=262144。考虑到每个节点都会收到重复的消息,但是从与自己相连的每个节点最多会收到相同的重复消息,所以消息通常最多经过6次后会覆盖整个比特币网络。
包含在块中
如果矿工成功竞争记账,交易将被打包到区块中,成为链上的区块部分,并将交易引用的 UTXO 标记为已花费。当这个区块之后有足够多的区块时,可以认为该交易记录在比特币账本中,无法修改,交易彻底完成。这部分会在挖矿文章中详细讲解。
(待续)