比特币交易过程
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次后,这笔交易才有效。
因为区块链就是一环扣一环,该区块包含父区块的信息哈希值和自己的时间戳,除非把之前的区块打到重来,不然拒绝篡改。