Handshake协议摘要
本指南适用于对比特币协议及其一般共识参数有一定了解的开发人员。
以下所有数据均描述了主网参数。Testnet,regtest和simnet
可能有所不同。链接在撰写本文时即在主网络启动之前引用了hsd
代码库。
区块链
- 区块时间:10分钟
- 逐块调整PoW难度,目标:每天144个区块。
- 最大块大小:1,000,000字节基本块大小,4000000重量单位
- 哈希算法:BLAKE2b + SHA3
- Handshake中的哈希是Big-Endian。
- 隔离见证:Handshake为100%SegWit,见证人承诺在区块头中。
- 块头:Handshake块头为236个字节,并提交给多个树根:
- merkle:基本交易数据
- 见证人:交易见证人数据
- 树:域名资源urkel树的根。(每36块更新一次,一天约4次)
- 保留:(当前未实现)将用于第2层扩展。
- 工作量证明哈希涉及对块头的重新序列化,包括
maskHash
旨在防止块保留攻击的设计。 - Coinbase交易:
供应
- 基本单位:dollarydoo
- 1 HNS = 1,000,000 dollarydoo
- 最大总供应量:2,040,000,000 HNS
- 空投:1,360,000,000 HNS, 空投占整个代币供应的2/3
- 初始块奖励:2,000 HNS
- 区块奖励减半周期:170,000区块(约3 1/4年)
交易
由于“Handshake”仅适用于SegWit,因此没有输出脚本,只有地址(它们本身是见证程序版本+见证程序哈希)。 见证程序可以对公钥或脚本哈希进行编码,但是这些密钥和脚本将作为见证堆条目出现在交易输入中。
Handshake还在交易输出中引入了一个称为 covenant
的新字段。所有交易输出都包含一个值,一个地址和一个契约。
契约 (Covenants)
Handshake域名拍卖系统由交易契约运行。当前,所有 契约类型 都运行在域名系统上,可以添加不影响域名系统的新契约。可以通过软分叉添加新的契约类型。
盟约包含一个类型和一个条目数组。条目数组包括拍卖详细信息,例如域名哈希 或盲注出价。
域名契约链接在一起,就像交易在链中输入和输出转移价值一样。此外,某些契约必须标识正确的域名哈希才能有效。关于契约使用的顺序也有规则。 一个交易可以有多个契约,但是输入和输出索引是链接的。
域名拍卖契约类型的转移:
From --> | --> To | Purpose |
---|---|---|
NONE , REDEEM , OPEN | NONE | Just sending money |
NONE , REDEEM , OPEN | OPEN | Start an auction for an available name |
NONE , REDEEM , OPEN | BID | Bid on an open auction for a name with a blinded value |
BID | REVEAL | Reveal the amount that was bid on a name |
REVEAL | REDEEM | Sweep a losing auction bid back to wallet |
NONE | CLAIM | Names in the Alexa top 100,000 are reserved for legacy DNS owners |
CLAIM , REVEAL | REGISTER | Update the DNS resource for an owned or won name (effectively burns coins) |
由于Handshake使用维克里拍卖, 因此最高出价者支付第二高的出价。 如果仅有一个提交的投标,则该投标人实质上可以收回其整个投标(当他们注册时),并支付第二高的投标价:零。
注册域名后,其值将永远被锁定,但是域名状态仍然可以更改。
更新“拥有的”域名的契约类型:
From --> | --> To | Purpose |
---|---|---|
REGISTER , UPDATE , RENEW , TRANSFER , FINALIZE | UPDATE | Update the DNS resource |
REGISTER , UPDATE , RENEW , TRANSFER , FINALIZE | RENEW | Renew name ownership before expiration |
REGISTER , UPDATE , RENEW , FINALIZE | TRANSFER | Initiate ownership transfer to new Handshake address |
TRANSFER | FINALIZE | Confirm ownership to new Handshake address |
REGISTER , UPDATE , RENEW , TRANSFER , FINALIZE | REVOKE | burn name. Used when a key is compromised |
转移被锁定大约两天,
然后才可以最终确认。在该阶段的任何时候,原始所有者都可以撤消(REVOKE)
。失效的域名可以在过期后重新拍卖,但是当前的所有权链已终止。
域名必须在两年内续费, 否则它们将再次拍卖。
使用 REGISTER
或 UPDATE
更新域名时,新资源存储在链数据库中的临时数据结构
中。每隔36个块(约6小时),此缓存将提交给urkel树。
据白皮书:
因为我们的树是由一系列附加文件实现的,所以需要一个特定的时间间隔来防止历史记录膨胀,否则可能需要用户定期压缩历史记录。
拍卖
域名拍卖过程会经历基于时间(区块深度)的一些列状态。 首次在链上看到域名时,其状态被设置为当前块的高度。 该高度保存在数据库中,并用作整个拍卖过程的参考点。
域名过期后可以将其重置。 如果契约类型在错误的阶段广播,则将被拒绝。
Blocks since previous state | Approx. time | Current state |
---|---|---|
(undefined name) | CLOSED | |
< 37 | ~6 hours | OPEN |
< 720 | ~5 days | BIDDING |
< 1,440 | ~10 days | REVEAL |
> 0 | CLOSED |
当预留的域名在链上被声明时,它们进入约30天的锁定期。
在此 LOCKED(锁定)
阶段,可以重新申明预留域名。
这是为密钥被泄露的旧DNS域名持有者提供的解决方案。
申明(Claims)
Alexa前100,000名中的旧DNS域名是为其当前所有者保留的。 您可以在names.json中看到列表。
申明以特殊类型的交易消息广播到网络,而矿工将证明包含在coinbase输入中
RSA-1024软分叉
DNSSEC证明可以使用多种算法进行签名。 不幸的是,这包括1024位 RSA。 有限的密钥可能会在不久的将来遭到破解,就像SHA-1一样。 因此,Handshake已经准备好一个软分叉, 以防止此类申明。 在激活软分叉之后,将禁止注册 已经使用弱钥声明的域名。在注册之前,可以 随时重新申明保留的域名。
KSK-2010软分叉
在撰写《Handshake》白皮书时,所考虑的系统漏洞之一是ICANN 2010年key-signing-key的撤销或损害。 该软件的早期版本包括一个软分叉的规则,该规则将禁止以KSK-2010为根的DNSSEC证明保留域名。 从那时起,ICANN 已明确的撤销该2010年密钥, 并删除了软分叉。 现在,KSK-2017是Handshake声明中允许的唯一根区域密钥。
域名发布
当主网启动时,未保留的名称并非立即可用。 它们会根据一种简单的算法在第一年推出,该算法会将域名的哈希值与52周的模数进行比较。
RPC调用 getnameinfo 将返回 周数
,指示给定名称何时可用。
整个网络Handshake拍卖系统要等到网络运行的第一个十四天后 后才能激活。 实际上,为了积累安全的工作量证明,在开始的十四天内 不允许进行任何类型的交易。
空投
代币总供应量的三分之二预留给开源软件社区中的数十万互联网用户。 公钥以各种方式收集并添加到merkle tree中, 该树的根由共识代码提交, 甚至在创世块中引用。通过向网络提交证明来兑换空投。
空投输出不像其他加密货币空投一样包含在创世块中。 Handshake空投就像可以随时提交的交易一样。 矿工将空投输出添加到新区块的币库交易中,并在相应输入的见证人 中编码证明。
空投证明
收到空投到外部平台上的公钥的用户可以使用自定义签名工具兑换它, 该工具具有内置的隐藏因子来隐藏收件人的身份。由于用户拥有各种各样的公钥类型,因此空投证明必须遵循上述针对名称声明所述的RSA-1024软分叉。
水龙头证明
在2018年期间通过网站注册的用户可以使用一部分空投。 这些用户使用水龙头工具 生成了主要的网络Handshake地址,并将其与元数据一起提交。 因为这些空投接收者是按地址而不是公共密钥记录的,所以不需要签名来生成其空投交易(当然,与其他任何地址一样,从空投时需要签名)。 由于可以由任何节点随时生成和提交这些交易,因此它们的费用是硬编码的,并由共识规则强制执行。
链数据库中的位域 可防止空投兑换两次。
脚本操作码
几个新的OP代码已添加到兑换脚本语言中。
Hex Code | Name | Operation |
---|---|---|
0xd0 | OP_TYPE | Get the covenant type (int) from the corresponding tx output and push on to stack |
该额外的OP码已添加到“Handshake”中,以使域名更新和传输更加安全。 例如,可以实现一个热/冷钱包系统,其中“冷”私钥处理域名转移,而“热”私钥用于DNS资源更新。
Handshake还实现了四个附加的哈希函数OP码。 这些中的每一个从堆栈中弹出一个项目,然后返回该blob的哈希函数摘要。
Hex Code | Name |
---|---|
0xc0 | OP_BLAKE160 |
0xc1 | OP_BLAKE256 |
0xc2 | OP_SHA3 |
0xc3 | OP_KECCAK |
签名哈希类型
Handshake实现了两种新的签名哈希类型。通过签署对交易元素不同组合的提交,可以在更具创造性的交易中使用它们。
SIGHASH_NOINPUT
在比特币中被定义为BIP118,
并实现了链下协议和第二层协议的灵活性。
它允许TX从“解决”赎回脚本的任何输出中支出,而不用通过txid
和index
指定一个单一的tx输出。。它被实现为掩码0x40,
因此可以与其他SIGHASH标志(例如)结合使用 SIGHASH_SINGLE
。
SIGHASH_SINGLEREVERSE
允许将名称在链上原子出售给硬币持有人。
一个域名所有者可以生成特制的交易,该域名的所有人承诺输入一个用于签名输入,然后输入一个将币花到其钱包的输出。
另一位用户可以添加一个为交易提供资金的输入,并将 TRANSFER
输出添加到他们自己的地址。
请注意,购买者必须要求名称拥有脚本 OP_TYPE
以这种方式进行检查,以防止名称拥有者在发出 FINALIZE
之前发出 REVOKE
。
此Sighash类型实现为0x04
。