这篇文章首次被发布在Medium上。
区块头包含了该区块在被创建时的时间戳。但是,我们经常想要获取区块高度,这并不包括在区块头中。我们设计了一种新技术来获取区块高度,它包含在Coinbase交易中。
来自Coinbase交易的区块高度
Coinbase交易是一个区块中的第一笔交易。
[caption id="attachment_473984" align="alignnone" width="572"] 一个区块中的Coinbase交易[/caption]BIP34规定区块高度必须是Coinbase交易的解锁脚本中的第一项,如下图所示。
[caption id="attachment_473988" align="alignnone" width="432"] 一笔Coinbase交易[/caption]blockHeight()函数返回一个具有给定区块头的区块的高度,如下图所示。使用我们之前的技术,我们可以在第13行和第16行使用Merkle证明来访问一个给定区块中的交易。我们可以进一步验证它是一笔满足第5至8行的三个约束条件的Coinbase交易。
- 它正好有一个txin。
- 这个txin的prevout hash是0x0000…0000。
- 这个txin的prevout index是0xFFFFFFFF。
一旦我们有了Coinbase交易,我们就从第21行中提取区块高度。
[caption id="attachment_473990" align="alignnone" width="994"] 区块链合约[/caption]验证Coinbase的一种替代方案
还有一种使用其Merkle路径来验证一笔交易的方法,那就是Coinbase。由于Coinbase是一个区块中的第一笔交易,其Merkle路径上的所有节点必须位于右侧,如下图所示。
我们可以简单地检查Merkle路径上的所有同层级是否都在右侧。这个代码如下所示:
[caption id="attachment_473997" align="alignnone" width="791"] MerklePath合约[/caption]总结
一旦我们有了区块高度,我们就可以在各种智能合约中使用它。
Coinbase可能包含除区块高度之外的其他信息,如MinerID。它也可以在智能合约中被使用。
我们在下面列出了几个例子:
- 一个合约只能在一定的区块高度后被解锁,这类似于CheckLockTimeVerify。
- 一份合约,只有在高度为720,000至720,010的区块中至少有一个区块被其挖出的情方的私密低费用交易。
我们期待着您能够在这些技术的基础上制定出各种富有创造性的合约。
请您阅读最新的电子书,BSV区块链作为一种企业网络安全框架。