BSV节点软件升级版本v1.0.9正式发布

请添加图片描述
发表时间:2021年10月19日
信息来源:bitcoinsv.io


请添加图片描述

BSV节点软件v1.0.9(正式版)是在v1.0.8(正式版)基础之上的推荐升级版本;这次升级版本改进了安全模式下的处理性能,同时增设了网络回调(webhook)通知、区块内发生双花时的点对点通知消息、以及允许在双花发生时冻结其对应的交易输出。

详细内容列示如下:

  1. 在区块内有双花发生时,新增点对点通知消息。*
  2. 改进了的安全模式下的处理性能,包括新增RPC接口允许手动控制安全模式。*
  3. 在发生链竞争和双花时将有网络回调通知。
  4. 允许冻结交易输出。*
  5. 在处理交易链时的性能提升。

对区块预扣(withholding)攻击的响应

背景

在过去的几个月里,BSV网络上发生了多次攻击尝试。攻击涉及挖掘一条隐藏的备用链(长度大于80个区块),然后将其一次性发布到区块链上,使其成为新的主链。新的区块链中用双花交易替换了原始区块链中的一些交易。交易所通常会在存取资金的交易达到一定数量的区块确认(例如攻击者试图替换的交易上已有50个确认)后才认为有效,举例来说,这样可以防止攻击者在存入双花的BSV后就立即开始交易,或在隐藏链中重复之前在主链上的操作再次提取资金。

BSV区块链和其它PoW区块链很容易遭到此类攻击,因为在互相竞争的网络中有大量可随时切换使用的算力。

我们针对此类攻击的对策包括:

  1. 设置全天候不间断的监控:
    • 在网络中出现很长的竞争链时通知矿工。
    • 在新链里出现双花交易时通知交易所和用户。
  2. 请求诚实矿工使用invalidateblock命令将整条隐藏链全部作废,然后回到原来诚实的链上继续挖矿,直至其成为主链。

对安全模式状态改变的通知(竞争链)

如果发生可疑事件(很可能是攻击),交易所和矿工将收到通知。触发条件是网络中突然出现了一条很长的竞争区块链。

区块重组通知也是安全模式通知的一部分。

扫描二维码关注公众号,回复: 13192569 查看本文章

BSV节点软件目前包含的“安全模式”逻辑可以检测竞争链并停用对钱包的RPC调用(进入安全模式)。安全模式的逻辑已被更新,现在可以配置对链的检测(允许用户根据他们对可疑事件的敏感程度来自定义),并通过网络回调(webhook)触发对交易所、矿工和应用服务提供商的通知。

对双花的通知

交易所和矿工将收到有关BSV网络竞争链最近双花的通知。

区块链监控应用可能会向BSV节点(即挖矿节点)发送DSD点对点通知消息,然后节点会将该消息传播给其它节点。消息里包含了双花证明(区块包含某个交易的Merkle证明)。通知通过网络回调(webhook)发出。

冻结双花交易

BSV节点(特指挖矿节点)现在可以“冻结”特定的TXO(交易输出),例如被双花交易使用的交易输出。

如果某个交易输出被策略冻结,那么节点在挖矿时将不会把试图花费这个TXO的交易放进区块模板中,但会接受包含了花费这个TXO的交易的外部区块。

一些特定改动

DS Detector接口

节点软件将在双花被检测到时收到DSD点对点消息。节点收到DSD消息后,(a)验证DSD消息的有效性(以确保不是恶意伪造),(b)将DSD消息传播给其他节点,以及(c)使用网络回调通知用户。

请注意,没有必要将每个区块中的每个双花都通知给对等节点(peers),只通知在不同区块中相互冲突的单个交易的详细信息,就足够了。

DSD点对点消息

新的DSD点对点消息格式如下:
请添加图片描述
block_details:
请添加图片描述

block_header:
请添加图片描述

点击这里获取DSD点对点消息的技术文档。

网络回调(webhook)DSD通知消息

当在备用链上检测到新的双花时,节点将使用网络回调通知监听器。可以使用新的命令行参数dsdetectedwebhookurl设置网络回调消息的接收者。
DSD通知消息模板示例:

{
    "version" : number,
    "blocks : [
        {
 
            "divergentBlockHash" : string,
            "headers" : [
                {
                    "version" : number,
                    "hashPrevBlock" : string,
                    "hashMerkleRoot" : string,
                    "time" : number,
                    "bits" : number,
                    "nonce" : number
                }
            ],
            "merkleProof" : {
                "index" : number,
                "txOrId" : string,    // Full transaction, serialised, hex-encoded
                "targetType": "merkleRoot",
                "target" : string,    // Merkle-root
                "nodes" : [ "hash", ... ]
            }
        },
        ...
    ]
}

这个通知消息的文档是docs/web_hooks.md。

RPC接口getblockheader已被更新为报告区块的有效或无效状态。

升级安全模式的触发机制

安全模式会禁用节点的钱包功能导致用户无法花费BSV。当检测到长的竞争(并行)区块链时,安全模式会被触发。即当攻击链被发现时。网络回调用于在安全模式状态发生改变时通知用户。

此次更新还修改了安全模式的触发逻辑。

这个版本引入了3个全新的命令行参数:

  1. safemodemaxforkdistance,默认值为1000(挖矿7天)
  2. safemodeminforklength,默认值为3
  3. safemodeminblockdifference,默认值为-72(在低于当前链高度的链上挖矿12小时)

如果下列条件均被满足,则会触发安全模式:

  • 当前块高与分叉处最后一个公共区块头之间的距离小于safemodemaxforkdistance
  • 分叉链的长度超过safemodeminforklength
  • 分叉链累计的工作量证明超过最小的分叉工作量证明(POW)。分叉工作量证明的最小值与活跃链的高度有关,可用此公式计算:< total-proof-of-work-active-chain > + safemodeminblockdifference * < proof-of-work-of-the-active-tip >。实际上,它归结为:如果分叉链的高度大于< height-active-chain-tip > + safemodeminblockdifference,则激活安全模式。请注意,safemodeminblockdifference的负值意味着它会在分叉链的高度低于活跃链时激活安全模式。

当前实现的第一个条件被保留,但会在竞争链超过活动链之前被触发。当竞争链追赶主链到两者的高度差小于safemodeminforklength,或者竞争链高度大于主链高度,安全模式就会被激活。

网络回调DSD通知消息

节点会在自己进入或退出安全模式、或在安全模式中发生了下列任一事件时,通过网络回调通知监听器。

  • 非主链被延长
  • 拉取到了非主链的最新区块
  • 某条链的有效状态发生变化(例如使用了invalidateblock命令)
  • 发生了区块重组(reorg)

在初始化区块下载或重建索引时,即使存在触发安全模式的条件也不会有通知发生。

只对当前安全模式状态感兴趣的用户可以查看通知消息中的safemodeenabled 字段(见下文)。

可以使用新的命令行参数safemodewebhookurl来设置网络回调消息的接收者。

安全模式通知消息模板示例:

{
    "safemodeenabled": boolean,           // Is the node in the safe mode.
    "activetip": {                        // Tip of the main chain.
        "hash": string,                   // Block hash.
        "height": number,                 // Block height.
        "blocktime": string,              // Human readable, UTC, block time.
        "firstseentime": string,          // Human readable, UTC, time when the node first received header.
        "status": "active"                // Status of the block. Possible values: active, invalid
                                          //     headers-only, valid-fork, and valid-headers.
    },
    "timeutc": string,                    // Human readable, UTC, time of creation of this message.
    "reorg": {                            // Information about possible reorg.
        "happened": bool,                 // Indicates if an reorg happened.
        "numberofdisconnectedblocks": number, // Number of blocks disconnected in reorg.
        "oldtip": {                       // Information about old active tip, "null" if an reorg did not happened.
            "hash": string,               
            "height": number,
            "blocktime": string,
            "firstseentime": string,
            "status": string
        }
    },
    "forks": [                             // List of forks that are triggering the safe mode.
        {
            "forkfirstblock": {            // Root of the fork, this block's parent is on the main chain.
                "hash": string,
                "height": number,
                "blocktime": string,
                "firstseentime": string,
                "status": string
            },
            "tips": [                      // List of tips of this fork.
                {
                    "hash": string,
                    "height": number,
                    "blocktime": string,
                    "firstseentime": string,
                    "status": string
                },
                ...
            ],
            "lastcommonblock": {            // Block on the main chain which is parent of the "forkfirstblock"
                "hash": string,
                "height": number,
                "blocktime": string,
                "firstseentime": string,
                "status": string
            },
            "activechainfirstblock": {      // Block on the main chain which is child of the "lastcommonblock"
                "hash": string,
                "height": number,
                "blocktime": string,
                "firstseentime": string,
                "status": string
            },
        },
    ...
    ]
}

该通知消息的文档也是docs/web_hooks.md。

全新的用于启用和禁用安全模式的RPC方法

这些RPC方法允许用户手动修改安全模式状态,而不需要重启节点软件。
此版本引入了三个全新的RPC接口:

  1. ignoresafemodeforblock <block_hash> - 在验证是否进入安全模式的条件时,忽略指定的区块及其后面的所有区块。
  2. reconsidersafemodeforblock <block_hash> - 在验证是否进入安全模式的条件时,考虑指定的区块及其后面的所有区块。
  3. getsafemodeinfo - 获取安全模式状态的详细信息。

这些RPC设置不会在节点重启后被保留。

对冻结TXO(交易输出)的支持

节点现在可以“冻结”指定的TXO(交易输出)。冻结可被应用在已花费的和未花费的交易输出上,并可被用来确保节点不处理已知的双花。

如果某个TXO被策略冻结,那么节点在挖矿时将不会把试图花费这个TXO的交易放进区块模板中,但会接受包含了花费这个TXO的交易的外部区块。

此版本引入了全新的RPC接口:

  1. addToPolicyBlacklist < funds : object > - 将某个TXO加入策略冻结黑名单(即不再接受花费这个TXO的交易,但可能接受包含花费这个TXO的交易的区块,如果这个TXO不在共识冻结黑名单中)。
  2. removeFromPolicyBlacklist < funds : object > - 从策略冻结黑名单中移除某个TXO。
  3. queryBlacklist – 从数据库中返回所有被冻结的TXO。
  4. clearBlacklists <removeAllEntries : boolean, default=true> - 从黑名单中移除条目。

性能改进

这个版本优化了在极端负载下节点对长且复杂的链式交易的处理。

请在此下载可执行文件和源代码:https://download.bitcoinsv.io/bitcoinsv/

如有问题,您可以通过邮件[email protected]或Telegram https://t.me/bitcoinsvsupport联系我们。

感谢您对BSV的持续支持!

本公告代表Steve Shadders和BSV基础架构团队向您发送。


目前,全球已有超过400个项目构建于BSV区块链之上。凭借坚如磐石的协议及超高的网络性能,BSV生态系统迅猛发展,我们期待未来出现更多前所未有的商业应用。


  • 对BSV区块链开发感兴趣的朋友可以通过CSDN站内私信联系我们,申请加入BSV开发者交流群。
  • 同时,您也可以扫描下方二维码,关注BSV区块链官方微信公众号,了解更多区块链领域的实时资讯。
    Alt

猜你喜欢

转载自blog.csdn.net/BitcoinSV/article/details/120879488