公钥和私钥
每个比特币账户包括一个私钥和一个公钥。
- 私钥(k)是一个随机产生的数字。
- 有了私钥,我们就可以使用椭圆曲线数乘这个单向加密函数产生一个公钥(K)。
- 比特币的钱包地址是从公钥通过一系列加密运算(包括SHA-256和RIPEMD-160散列函数)派生出来的一串字符。
私钥、公钥和比特币地址之间的关系如下图所示:
交易
UTXO (Unspent Transaction Outputs):未使用过的交易输出。
每个全节点都会维护一个UTXO池。
- 发起交易:
- 当比特币的持有者想要发送比特币时,他们会创建一笔交易,这笔交易包含了发送方和接收方的比特币地址以及转账金额等信息。
- 签名交易:
- 发送者使用其私钥对交易信息进行数字签名。这个签名能证明交易信息是由私钥的持有者发起的,同时保证了交易信息在传输过程中未被篡改。
- 传播交易:
- 签名后的交易被发送到比特币网络,等待矿工验证并加入到区块链中。
- 验证签名:
-
矿工接收到交易后,会使用发送者的公钥来验证签名的有效性。具体来说,矿工会对签名进行验证,确保它和交易详情相匹配。
-
验证过程实际上是确认签名是由对应的私钥生成,并且交易没有被更改。因为数字签名使用了非对称加密技术,所以可以通过公钥来验证是对应私钥的持有者签名的。
验证交易历史: -
除了验证数字签名外,矿工还需要验证交易的输入是否有效。这涉及到检查区块链以确保所引用的比特币没有被之前的交易花费,即所谓的双重支付检查。
矿工确认这些比特币确实属于发送者,并且可以被花费。
-
- 确认交易:
- 如果交易签名和历史均验证无误,矿工将这笔交易包含在下一个区块中,通过解决一个数学难题(挖矿)来获得记账权。
一旦区块被矿工成功挖出并被其他节点确认无误后加入到区块链中,交易就被认为是确认的。一般来说,交易在被包含在一个区块后开始被视为有效,而更多的确认会提高交易不可逆的保证。
- 如果交易签名和历史均验证无误,矿工将这笔交易包含在下一个区块中,通过解决一个数学难题(挖矿)来获得记账权。
交易脚本
• 比特币交易脚本语言称为脚本,是一种类似Forth的基于栈执行的逆波兰表达式语言
• 非图灵完备性(除了有条件的流控制外,没有循环或复杂流程控制能力)
• 放置在UTXO上的锁定脚本和解锁脚本都使用这种语言
• 每一笔比特币交易被验证时,每一个输入中的解锁脚本将与其对应的锁定脚本一起
执行,以确定交易是否满足支付条件
• 大多数经比特币网络处理的交易都是基于“P2PKH(Pay-to-Public-Key-Hash)的脚本
时间锁
只允许在某个时间点之后才可以被支出的交易或输出。
- 交易锁定时间(nlocktime):交易级设置(交易数据结构中的一个字段:区块数/时间戳),它定义交
易有效的最早时间,并且可以在网络上中继或添加到区块链中 - 检查锁定时间验证(CLTV):通过在输出的赎回脚本中添加CLTV操作码来限制输出,从而只能在指
定的时间过后使用。 nlocktime(锁定时间)是交易级别的时间锁,CLTV是输出级别的时间锁。 - nSequence(相对时间):表示该输入对应的UTXO过了n个区块后才生效
- 带CSV的相对时间锁(CSV):通过在输出的赎回脚本中添加CSV操作码来限制输出,从而只能在指定的相对时间过后使用。