比特币交易过程

1、钱包

钱包可以包含多个地址,地址类似于银行卡号,然后有私钥。

私钥产生公钥,公钥产生地址。

私钥是由种子随机数生成,现在有助记词,也可以用于推导私钥。私钥 = 助记词。

由于私钥64位,长得太难看,没有可读性,而私钥的备份在电脑上复制起来容易,手抄下来就比较麻烦,但私钥保存在联网的电脑上毕竟不安全,有被其他人看到的风险,于是有了助记词工具,利用某种算法可以将64位私钥转换成十多个常见的英文单词,这些单词都来源于一个固定词库,根据一定算法得来。

钱包的功能:1、保存私钥、地址;2、接入比特币网络,用于发送和接收交易。

没有余额、账号概念,就是UTXO,比特币的记录就是UTXO的记录,常说的余额就是统计地址的所有UTXO输入减去UTXO输出。

2、交易生成

一笔交易信息的形成有输入和输出,输入是UTXO、解锁脚本(包含付款人对本次交易的签名(<sig>)和付款人公钥(<PubK(A)>))、UTXO序号(来源的),输出是发送数量、锁定脚本、UTXO序号(生成的)。其实交易的原理,就是使用原有的UTXO生成新的UTXO,所以输入输出都有UTXO序号,别搞混。然后脚本,有解锁脚本和锁定脚本,通常把解锁脚本和锁定脚本串联起来,才能用于验证交易的可行性。

交易的验证目的有两个:1、输入的UTXO确实是付款人的;2、交易信息没有被篡改过。

交易的验证方法是脚本的操作,脚本其实是数据和操作符,通过简单的出栈、入栈,最后是否达到true。例如常见的脚本如下:

锁定脚本:<sig><PubK(B)>

解锁脚本:OP_DUP、OP_HASH160、<PubKHash(B)>、OP_EQUALVERIFY、OP_CHECKSIG

OP_ 开头的表示操作符,<> 中间的内容表示数据,<> 表示入栈

OP_DUP、OP_HASH160、<PubKHash(B)>、OP_EQUALVERIFY 这几步是验证这笔UTXO确实是付款人的,OP_CHECKSIG 这一步是验证 <sig><PubK(B)> 是否成立,即通过付款人的公钥对签名信息进行解密,是否等于原文信息,保证原文信息没被篡改过。

输入和输出可以有多个,简单来说:输入=要花费的UTXO+解锁脚本,输出=UTXO(币的数量+锁定脚本)

3、交易接收

节点验证交易时有以下几步,验证通过后放入本地的Transaction数据库,并广播给相邻节点,不通过则丢弃:

(1)交易的size要小于区块的size的上限

(2)交易输入UTXO是存在的

(3)交易输入UTXO没有被其它交易引用-防止双花(Double Spending)

(4)输入总金额>输出总金额(多出来的钱是给旷工的小费)

(5)解锁脚本验证成功

4、挖矿

节点会并发进行两个操作:1、打包区块,搜索nonce值,使区块验证成功;2、监听其他节点的验证,监听到并验证成功后停止自己的搜索,启动下一个生成区块任务。

交易池会把已经打包进区块的交易丢掉。

节点可以过滤交易手续费低的交易,不打包进区块。

生成区块后,会有coinbase的挖矿奖励。

5、确认

通常达到6次后,这笔交易才有效。

因为区块链就是一环扣一环,该区块包含父区块的信息哈希值和自己的时间戳,除非把之前的区块打到重来,不然拒绝篡改。

原文地址:https://www.cnblogs.com/linguoguo/p/10413655.html