最后更新:2020-04-03 11:55:22 手机定位技术交流文章
在探索学习区块链扩展的技术时,了解到交联是第二层区块链扩展的重要组成部分,实现交联的技术主要包括公证技术、中继/侧链技术和哈希时间锁定技术。接下来,本文将详细介绍哈希时间锁定技术的原理和实现。
故事
很久以前,有一对夫妇分开了。他们用信来告诉对方他们的心,但他们担心邮递员会偷看信中的情书。这个人想出了一个好主意。他让邮递员给那个女人送一个盒子。盒子里有一把开着的锁。这位女士收到了信息,写了这封信,把它放在盒子里,并用锁把盒子锁上。收到盒子后,男人用唯一的钥匙打开盒子,读出女人的心情。他们完成了安全通信。这是下面讨论的哈希时间锁定的基本原理。
总结
哈希时间锁契约,也称为哈希锁,本质上是一个智能契约。这一概念最早出现在2013年比特币论坛的一次讨论中,并首次在比特币的闪电网络中得到应用和实施,其机制源于原子交换。
在雷电网的支付渠道中,通过散列时间锁定智能合同来实现。即限时转让。通过智能合同,双方同意让与人先冻结一笔钱,并通过哈希锁锁定发起方的交易令牌。如果有人能够在指定时间内提供之前生成的加密支付证书,并且与之前约定的哈希值一致,则交易可以完成。
可以看出,哈希时间锁定机制包括两个锁:哈希锁和时间锁。区块链上的事务的原子性是通过两个锁的巧妙配合来保证的,也就是说,只有在满足一定的时间条件和散列条件的情况下,事务才能被达到,否则什么也不会发生。
什么是散列锁和时间锁?
哈希锁
所谓的哈希锁意味着事务被哈希值锁定,并且锁只能被哈希值的原始值解锁。例如,哈希函数求值后字符串“key”的值为“1se ”,则由“1se”锁定的事务只能由原始值“key”解锁,而不考虑哈希冲突。
定时锁
所谓的时间锁意味着锁只能在指定的时间内解锁。例如,解锁的有效时间由时间锁设置为1小时,解锁条件是输入正确哈希值的初始值。那么解锁该时间锁的唯一条件是在1小时内输入哈希值的正确初始值。如果时间锁在1小时后解锁,即使哈希值输入正确,时间锁也不会解锁。
接收者只能根据哈希值的原始值在指定时间内解锁事务。在此期间,尽管发送方知道哈希值的原始值,但他仍然没有解锁的权利,从而限制了发送方在与接收方共享密钥后提前退款的邪恶行为。
类似地,如果接收者在有效时间内没有用哈希值的原始值解锁,那么接收者在有效时间过后也不可能成功解锁,即使接收者获得哈希值的原始值,因为在超时之后,发送者只能在这里解锁交易,也就是说,资产将被返回到发送者的账户。
通过散列锁和时间锁的巧妙配合,可以对资产的发送者和接收者形成相互制约,保证资产交换的发生或不发生,从而最终保证交易的原子性。
什么问题已经解决了
在通过传统的集中交易所进行资产交易时,我们通常需要先将资产移交给交易所,然后交易所将它们配对,最终促进交易。但是,由于这种交易所通常是集中交易所,必然会存在交易所的信任问题,这就带来了一定的交易风险和较高的手续费。
在通过哈希时间锁定机制处理资产时,通过哈希锁定和时间锁定的双重保证,可以限制资产的发送方和接收方,从而促进交易的发生。如果双方根据哈希时间锁定规则进行交易,则交易可以结束。如果交易失败,事实上区块链上没有交换资产,所以没有必要支付额外的交易费用。因此,通过散列时间锁定机制可以有效地保证跨链事务的原子性,而不需要第三方公证人的信任保证。
单向散列时间锁
所谓单向哈希时间锁定是指资产的发送方随机生成一个密钥x,通过哈希函数h()得到x对应的哈希值h(x),然后构造一个智能契约,在契约中规定只有当资产的接收方用x解锁契约,设置超时时间, 并且规定解锁仅在接收方在超时时间内通过密钥x解锁资产的情况下有效,并且如果超过超时时间,则资产的发送方可以解锁并返还资产。
例如,就好像我把一些资产放在了一栋大楼的保险箱里,在看到你之后,我把保险箱的钥匙给了你,并告诉你:只有在一个小时之内你在某个地方找到了这个保险箱,你才能解锁并取走这些资产。否则,一小时后,即使你有钥匙,你也不能拿走保险箱里的资产,只有我有权打开保险箱拿走资产。
接下来,让我们以以太网广场中的智能契约语言Solidity为例来看看哈希时间锁定的具体实现:
首先,我们需要定义散列时间锁定契约。我们需要设计合同的数据结构及其相应的三种主要方法:合同构建、资产收回和资产归还。
合同HashedTimelock {...struct LockContract {应付地址发件人;应付地址接收人;单位金额;bytes32 hashlock//使用sha256哈希函数uint timelock// UNIX时间戳秒-锁定,直到这一次布尔撤回;bool退款;字节32原图像;//这是秘密,sha256(_preimage)应该等于hashlock }...函数NewContract(address payable _ receiver,bytes32 _hashlock,uint _timelock)...{...}函数撤销(字节_ contractId,字节32 _ preimage...{...}功能撤销(字节32 _压缩)...{...}}我们可以看到,在锁定合同的定义中,我们规定了本合同的发送方和接收方,即本合同中锁定的资产只能由发送方或接收方取出。接下来,定义hashlock和timelock。对应于哈希锁的密钥是预映像。如果我们采用sha256加密方法,sha256(原图像)必须等于哈希锁。此外,我们还定义了锁定在合同中的资产数量以及合同的相应状态,即是否被撤回以及是否被退回。
合同HashedTimelock {...修饰符Fundssent(){ require(msg . value & gt。0,“msg.value”必须大于。0 ' ');_;}修饰词Futuretimelock(uint _ time){//唯一的要求是,时间锁定时间锁定指定的时间应该在最后一个块生成的时间(now)之后(_ time > now,“时间锁定时间必须在将来”);_;}函数NewContract(address payable _receiver,bytes32 _ hashlock,uint _timelock)外部应付款FundSent FuturateMelock(_ time lock)返回(byte 32 CompactiD){ CompactiD = sha 256(ABI . encodepacked(msg . sender,_ receiver,msg.value,_ has lock,_ time lock));//如果已经存在具有相同参数的合同,则创建新合同的请求将被拒绝。//发送方仅更改其中一个参数来创建不同的合同。if(HaVe ContaCt(CONTRACTId))revert();契约
图1
这时,我们可能会发现另一个问题。在前面的代码示例中,我们知道所谓的哈希解锁实际上是为了获得与用户通过哈希函数提供的密钥相对应的哈希值。如果刚刚获得的散列值与契约中存储的散列值相同,则证明用户具有相应的密钥,即解锁成功。在单个链中,我们只需要调用相同的散列函数,因为相同的密钥将通过相同的散列函数获得相同的散列值。在跨链哈希时间锁定场景中,我们还需要有这样一个要求,即两个链支持相同的哈希函数,如sha256等。因为如果我们在两个链中找不到相同的散列函数,那么尽管我们有相同的密钥,但我们肯定会通过不同的散列函数得到不同的值,因此我们永远无法解锁这个散列锁。在这个例子中,我们可以使用以太网和比特币支持的sha256哈希函数。
我们之前提到过哈希时间锁定的本质实际上是一个智能契约,但是在这个例子中,我们以比特币和以太网之间的资产交换为例,我们都知道比特币不支持像以太网那样只写契约,那么爱丽丝是如何在比特币网络中实现哈希时间锁定的呢?
在BIP-0199(比特币改进方案)中,建议在比特币网络中,散列时间锁定机制可以通过一系列脚本操作来实现。对于资产的发送者,他可以将资产发送到P2SH账户,并设置一个比特币脚本来验证接收者将来提供的密钥是否正确,并在交易中设置一个时间锁定。接收者还需要在timelock设置的时间内,用自己获得的密钥转移该P2SH帐户中的资产。否则,在时间锁定过期后,这些资产也将返回到发件人的帐户。虽然比特币没有智能契约系统,但它也可以通过自己的机制实现哈希时间锁定。以下简要介绍了哈希时间锁定机制中使用的几种比特币机制:
比特币脚本系统:简单程序可以在比特币系统中运行,运行这些简单程序的语言是比特币脚本。这些脚本是比特币交易锁定和解锁的基础。比特币脚本是一种功能相对较少的编程语言,能够满足比特币系统的正常运行要求,同时最大限度地保证安全性。例如,以下形式的比特币脚本将用于散列时间锁:操作_如果[散列函数]<摘要>中。OP _ EQUALVERIFY OP _ DUP OP _ hash 160 & lt;买方公钥哈希> 1。操作_ELSE <。num>。[时代周刊]OP _ DROP OP _ DUP OP _ has h160 & lt;refunder pubkey hash>。这里是OP_SHA256或OP_HASH160,它指的是用来散列密钥的散列函数。[时间输出]是OP _ CheckEquivalency或OP_CHECKLOCKTIMEVERIFY,其中OP_CHECKLOCKTIMEVERIFY操作码可以将输出货币锁定到将来某个时间,然后才可以使用。此外,这里包含的OP_CHECKLOCKTIMEVERIFY脚本的输出将被打包并广播。但是,如果您想使用这个输出,您需要等待锁定期,从而确保锁定的资产不会被重复使用,并且锁定期不能随意更改。这里的验证时间是绝对时间,通常有两个表达式,一个是时间戳,另一个是块高度。除了使用相对时间(例如,资产可以在一年后转移)之外,OP _ CHECKSEQUERY EVERRIFY操作码还用于检查资产锁定后是否可以解锁时间限制。P2SH机制:P2SH是比特币中的一种地址类型。比特币中有两种常见的地址:付费发布哈希(P2PKH)和付费脚本哈希(P2SH)。这两种不同地址类型的主要区别是资金转出条件不同。如果要转出P2PKH地址中的资金,则由发送方决定,只有发送方需要提供公钥和私钥签名,因此形式相对固定。但是,P2SH的资金转出由收款方决定,转出条件可以自由设置。具体来说,转出条件将被写入赎回脚本,P2SH中的S代表赎回脚本。锁定时间:在每笔比特币交易中,都有一个锁定时间字段。只有当当前时间大于或等于锁定时间时,才能广播和打包该传输,否则节点将丢弃该传输事务。因为当事务的锁定时间不满足条件时,它不会被广播或打包,所以如果我们在将来的某个时间设置锁定时间,那么事务中的资产可以被提前使用,并且当到达锁定时间指定的时间时,事务将变得无效,因为找不到资产。这里的锁定时间是绝对时间,可以用两种方式表示,一种是时间戳,另一种是块高度。我们可以看到,我们也可以通过其独特的机制在比特币中实现散列时间锁定。这样,我们就完成了比特币和以太网的资产交换。由于散列锁和时间锁的巧妙配合,如果爱丽丝取出鲍勃锁定的以太网,交换资产中的所有交易都会发生。如果爱丽丝不取出被鲍勃锁定的以太网,所有的交易都不会发生在资产交换中,从而保证了资产交换的原子性。同时,我们还会发现,在这个过程中,只有哈希锁和时间锁被用来相互限制,没有第三方公证人出现。
简单评估
通过以上分析,我们可以得到任意两条链,只要它们能够基于时间约束或特定条件锁定资产,并且两条链都支持相同的哈希函数,那么我们就可以使用哈希时间锁定机制来实现两条链之间的跨链资产交换。
然而,我们在这里提到的跨链资产交换具体意味着爱丽丝和鲍勃应该同时在链a和链b中有账户,并且他们已经达成共识,爱丽丝将把链b中鲍勃的一些资产与链a中她的一些资产交换。本质上,这是两个交易。爱丽丝把一些资产转移到链a上的鲍勃的账户,而鲍勃把链b上的一些资产转移到链b上的爱丽丝的账户。我们可以通过散列锁和时间锁的相互限制来绑定这两个事务,从而实现整个资产交换的原子性。因此,我们通常也使用哈希时间锁定机制作为原子交换机制。然而,散列时间锁定机制不支持不同链上的资产迁移,也不支持跨链预测器。因此,哈希时间锁定机制将在其使用场景中受到限制。
让我们回忆一下跨链资产交换的过程。我们可以发现这次交易成功的关键在于爱丽丝是否用她拥有的秘密钥匙打开了鲍勃的以太网。只有当爱丽丝触发了交易,跨链资产交换才能成功,否则什么也不会发生,多笔交易的手续费将被浪费。
此外,当我们使用散列时间锁定机制在链之间交换资产时,我们会发现在创建交易时,我们已经确定了谁是接收者以及汇率是多少。也就是说,我们必须自己匹配需求。例如,一个用户想用100以太网交换2BTC,只有当另一个用户只想用2 BTC交换100以太网时,他们的需求才能匹配,然后才能通过散列时间锁定来执行资产交换。可以看出,当自己匹配需求时,这种方法相当复杂。
总而言之,哈希时间锁定有以下优点和缺点:
优势
跨链事务的原子性得到了更好的保证。从交叉链的角度来看,哈希时间锁定在机制上保证了它的高安全性。在hash时间锁的跨链应用中,事务本身由各个链独立执行和验证,由于hash锁和时间锁的相互制约,最终保证了资产跨链交换中的数据一致性和可验证性。实现相对简单,只要能够满足哈希锁或时间锁来延迟事务执行。通过散列锁和时间锁的巧妙配合,在链之间交换资产时消除了对第三方公证人的信任。自卑
使用场景有限,只能实现资产交换,不能实现资产转移,不能实现跨链合同执行。整个交易能否成功完成取决于拥有密钥的一方。只有当他解锁对方链条上的资产并公布密钥时,他才能这样做。交易对手需要自己匹配交易需求,交易只有在双方都满足资产交换需求的情况下才能完成,这通常比较复杂。它不适合全区块链的资产交换。它们必须能够支持相同的散列函数。摘要
为了实现不同链之间的资产交换,双方交换资产时通常需要相互信任,并保证交易的原子性。在哈希时间锁定机制中,双方需要提前锁定资产,这为彼此提供了信任基础。哈希锁和时间锁的巧妙配合可以限制资产交换的双方,从而保证事务的原子性。
只要任意两个链能够通过时间或某些条件锁定链上的资产,从而延迟事务的执行,并且这两个链同时支持相同的哈希函数,就可以通过哈希时间锁定机制实现链间的资产交换,这说明实现起来相对更好,实现成本更低。
总之,尽管散列时间锁定的使用场景相对有限,但是如果仅实现链之间的资产交换,散列时间锁定可以被视为具有高成本性能的方案。
文/思想工作
本文由 在线网速测试 整理编辑,转载请注明出处。