区块链知识总结——比特币系统的实现

UTXO介绍:

UTXO全名是Unspent Transaction Outputs未花费交易输出,相比于账户模型来说没那么直观。
在比特币的世界里,并没有一个纪录所有帐户余额的帐本。那么要怎么确定一个地址现在有多少余额呢?简单的说,你要回顾以前所有的交易,并且找到所有寄给你的比特币,再把他们全都加起来,才会知道。

交易中的输入与输出:


比特币中的一笔「交易」也较为复杂。假设今天,Fred给了Alice 2个BTC,Ted给了Alice 3个BTC,我们把这两笔寄给Alice,总和为5的BTC称为unspent Transaction outputs 即未花费交易输出:也就是说现在Alice拥有了两笔Unspent Transcation Outputs,可以当作他未来转钱给别人的 input
如果现在Aice想要转5 BTC给Bob,他要将前面两笔总和刚好为5的UTXO当作这笔交易的输入。而矿工要验证的就是并没有其他交易在先前的区块当中,已经使用过这笔unspent如果同一笔输出已经被发送过,那Output它就不是 unspent 了,这就是比特币预防Double spending 的方法。

交易实例:

从上图可以看到,每个交易都有一个交易id,且有2个输入和2个输出,上图中2个输出BTC后面有个绿色标志,鼠标移到上面显示“Unspent”,表示未花费,所以这2个输出目前都是保存在UTXO中的。

而上图中2个输入,其实也就是花费掉了UTXO中的2个输出(这个输出是上个交易的输出),所以这2个输入当然就不在UTXO中了。

可以这样理解,UTXO相当于承担中间人的作用,对于一笔交易而言,输入部分就是花费UTXO中上个交易的输出部分,会产生新的输出部分存在UTXO中,然后下个交易的输入部分又会花费掉刚存在UTXO的输出,这样依次类推,就形成了一个完整的交易链且不断的链下去。这就是为什么说比特币是基于交易的账本模式。这个过程可以通过如下图所示:


 

 交易分类:

普通交易:用户之间的普通转账交易

其中Confirmations(确认)代表后面连接了16117个区块,所以这个交易是确认了,通常一般6个区块就代表确认了,因为很难更改了。

Coinbase交易:挖矿奖励,没有输入,只有输出。

(位于表身)

Coinbase交易:在比特币的区块链中,每个新区块中都包含一笔特殊的交易,是指一个特殊的交易类型。这种交易是由挖矿者创建的,用于领取挖矿奖励。它不需要输入交易的签名,而是包含一个新的比特币地址,用于接收挖矿奖励。Coinbase交易还包含了一些用于记录区块链的元数据,比如区块的高度和时间戳等信息。

解释:

为什么要创建新的比特币地址?

创建一个新的比特币地址用于Coinbase交易有几个原因:

  1. 隐私保护:使用新的比特币地址可以帮助保护矿工的隐私。由于比特币地址是公开的,如果矿工在每次挖矿时都使用相同的地址,那么所有的挖矿奖励都将汇聚到同一个地址上,从而暴露了该地址的持有者。为了避免这种情况,矿工会为每个Coinbase交易创建一个新的地址,使得挖矿奖励分散到不同的地址上,提高了隐私性。

  2. 安全性:使用新的地址可以增强安全性。如果矿工的地址被攻击或者暴露,他们可以轻松地切换到新的地址,而不会影响他们之前挖矿所获得的奖励。

  • 区块高度:
  • 区块在整个区块链中的位置。每个区块都有一个唯一的高度,它是由先前的区块的高度加一而得到的。区块高度可以用来跟踪和识别区块链上的特定区块。

  • 时间戳
  • 区块被创建时的时间戳,通常是以Unix时间格式表示的。时间戳记录了区块的生成时间,可以用于计算区块之间的间隔时间以及验证区块链的历史记录的时间顺序。

脚本介绍以及其具体实现:

比特币交易脚本:

比特币交易脚本是基于栈的表达式语言,是一种非常简单的语言,功能被设计的比较有限,只能做很少的操作,可以在简单的嵌入式硬件设备运行。

在比特币交易中,每个交易都包含输入脚本(input script)和输出脚本(output script),它们一起定义了交易的条件和限制。当验证交易时,输入脚本和输出脚本会在一起运行来确定交易是否有效。

  1. 输入脚本(解锁脚本):输入脚本包含了一段脚本代码,用于满足交易输入的条件。通常情况下,输入脚本包含了一些签名数据,以证明交易的合法性。例如,在支付交易中,输入脚本可能包含了交易的签名,证明这笔交易是由合法的交易发起者所创建的。

  2. 输出脚本(锁定脚本):输出脚本定义了交易的输出条件,通常是一个锁定脚本(locking script),用于指定接收者的地址或者一些其他的条件。当输出被解锁时,输出脚本会返回一个true值。

在验证交易时,输入脚本和输出脚本会按照以下步骤运行:

  • 首先,输出脚本会被加载到栈中,并执行。
  • 接着,输入脚本会被加载到栈中,并执行。
  • 如果最终栈中的值为true,则交易被视为有效;否则,交易被视为无效。

如果输入脚本能够成功解锁输出脚本,证明交易满足了所有的条件,交易就会被确认并添加到区块链中。否则,交易将被拒绝。

比特币中的交易脚本有多种形式:

  • P2PK(Pay to public key)
  • P2PKH(Pay to public key hash)
  • P2SH(Pay to script hash)
  • RETURN脚本

其中P2PKH(Pay to public key hash)是最常见的。

P2PK(Pay to public key)模式:

此种形式是最简单的,后面被P2PKH取代了。

特点:锁定脚本直接给出的是收款人的公钥。

依次压入栈图解如下:

1.解锁脚本里的签名压入栈

3.弹出2个元素,用公钥来验证签名的,若正确返回TRUE,验证通过,否则验证不通过,交易非法

详解:由于UTXO锁定脚本里面给出的是收款人的公钥,比如收款人是Zarten1,那么只有Zarten1带有自己的签名(对应的私钥生成),公钥才能验证通过,其他人无法验证通过,所以交易也不会通过。

P2PKH(Pay to public key hash)模式:

锁定脚本中给出的是收款人的公钥的哈希,这种形式是最普遍常用的。

依次压入栈图解如下:

1.解锁脚本里的签名压入栈

2.解锁脚本里的公钥压入栈

3.接下来进入锁定脚本里面,将栈顶元素复制一遍

4.将栈顶元素弹出并取哈希,将哈希值再压入栈

5.锁定脚本里公钥的哈希(也就是收款人的地址)压入栈

6.弹出栈顶的2个元素,并比较是否相等,若相等则从栈消失,不相等则非法

7.用公钥检查签名是否正确,正确返回TRUE,验证通过,交易合法,否则交易非法

特殊RETURN脚本:

RETURN存在于锁定脚本中。

这个特殊的脚本中,语法是:以RETURN语句开始,后面可以写入任何的内容,这个内容被限制在了80个字节,并且通常以散列方式呈现。

RETURN操作码的含义是:无条件的返回错误,所以该脚本永远不可能通过验证。执行到RETURN,后续操作不会再执行,所以这个锁定脚本永远无法执行,里面的比特币也无法花费,因此带有RETURN语句的锁定脚本不会保存在UTXO中。

介绍如下图所示:

作用

在锁定脚本中出现了RETURN操作码后就报错了,那这里面的钱永远也花不出去了,这样做有什么作用呢?

  • 部分小币种(AltCoin)要求销毁部分比特币才能得到该种小币种。例如,销毁一个BTC可以得到1000个小币。所以使用这种方法证明付出了一定代价,才能得到小币种。
  • 可以在RETURN语句里面写入一些内容,这个内容当然是不能篡改的,比如写入某个知识产权的哈希值,付出的代价是花费了比特币。

区块具体交易信息:

区块链中的每个区块都由两部分组成:表头(block header)和表身(block body),它们分别包含以下信息:

  1. 表头(Block Header):

    • 版本号(Version Number): 表示区块链所使用的协议版本。
    • 前一区块的哈希值(Previous Block Hash): 指向前一个区块的哈希值,将当前区块与前一个区块链接起来,形成链式结构。
    • 默克尔根(Merkle Root): 由区块内所有交易的哈希值构成的根哈希值,用于验证区块内的交易数据的完整性。
    • 时间戳(Timestamp): 记录了区块创建的时间。
    • 难度目标值(Difficulty Target): 表示此区块哈希值必须满足的难度目标,用于控制区块的挖矿难度。
    • Nonce值(Nonce): 是一个32位的随机数,矿工可以调整此值以尝试找到符合难度目标的有效哈希值。

  1. 表身(Block Body):

    • 交易信息(Transactions): 区块中包含的所有交易,包括交易的输入和输出,以及相关的签名和证明信息。
    • 其他数据(Additional Data): 可能包括一些额外的数据,例如矿工的奖励交易(coinbase transaction)、智能合约的执行结果等。

总的来说,区块链的表头用于链接区块链的各个区块,并包含了一些用于验证和保护区块链的基本信息,而表身则包含了实际的交易数据和其他相关信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值