关注章鱼网络,开启 Web3.0 浪潮
7 月 7 日,Octopus Network 与 BlockSec 共同主办了一场 Twitter Space,大家对智能合约的最佳安全实践,以及 NEAR 的智能合约安全特性进行了深入讨论,核心观点如下:

Robert Yan
Director of Security Service @BlockSecTeam
Vivi:在进行智能合约审计时,创业者或项目会犯下最大的错误是什么?听众可以从中学习什么,并避免踩坑?
Claudio Cossio:
首先,心态上要永远保持保持谦逊。尽管您已经建立了协议背后的全部基础设施,并且对其了如指掌,但用全新的视角审视智能合约的设计可能会发现一些新问题。
1、当审计团队或同行评审人员提出反馈时,要学会从他们的角度看问题,理解他们的意图,更重要的是与他们建立长期关系。
2、要理解总会存在未知的未知。安全通常被称为一门黑魔法,在 Web3 中,一切仍处于 Alpha 和 Beta 测试阶段,您永远无法 100% 安全。总会有一个你想不到的薄弱环节。最重要的是,我们要保护好用户的资产。
3、确保您有漏洞赏金计划。如果有用户或者白帽子发现某些代码运行有问题,一定要立刻告诉你的团队和审计伙伴,这样才能一起协作,快速找到解决方案。
总而言之,保持谦逊,认识未知的未知,并建立一个透明、奖励白帽黑客的漏洞赏金计划。
Louis:
对任何计算系统来说,安全性不仅仅在于保护系统的每个部分,还在于随时光流逝环境变化,但是一直可以保证系统的安全。因此,做到全生命周期安全管理至关重要。
区块链或智能合约系统有四个主要阶段:设计、实施、质量控制和运营。设计和运营阶段是相对最为重要的。
设计决定了最高水平的安全性,在这个阶段,我们可以通过牺牲一些功能来换取简单性。简单是使系统安全的最佳方式,因为随着系统复杂性的增加,安全风险呈指数增长。
在运营方面,许多漏洞都是由简单且可避免的错误导致的。任何对智能合约所做的更改都需要严格执行流程进行维护。因为魔鬼总是藏在细节中,我们必须仔细考虑运营阶段面临的各种场景。
Robert Yan:
对于那些刚接触加密领域或在 Web2.0 上开发产品的人来说,在构建智能合约时要更优先的考虑安全性。与可能侧重业务逻辑的传统开发者不同,构建智能合约的人需要从一开始就优先考虑安全性。是能考虑类似 DDoS 攻击、重入攻击或预言机操纵攻击等漏洞,以及由合约设计不当或功能不良引起的其他问题。例如,去年我们遇到了 Skyward Finance 事件,实际上这不是一个非常复杂的问题,如果程序员请求某人进行审计并确保其安全性,这样的事件本可以避免。
因此,开发者要从根本上重视安全性,并且保证第三方的安全审计,这应该是整个行业最重要和优先的事情。
Matthew Jiang:
作为一家审计公司,我认为 Web3 项目在审计过程中最大的陷阱是在牛市中仓促审计。合理规划产品时间表至关重要,充分的时间应该留给彻底的审计,因为审计质量是最重要的因素。
第二个问题是一些公司仅根据价格选择审计公司。他们要报价后选择最便宜的选项。在我看来,可能更应该根据他们在这些生态系统中的经验和审计方法进行选择,而不是仅仅关注价格。
第三点是存在太多未知,审计无法解决所有问题。我们需要保障产品整个生命周期的安全。
Vivi:使用 Rust 进行 NEAR 上的智能合约开发如何解决常见漏洞?NEAR 相比其他 Layer1 的智能合约是如何增强安全性呢?
Robert Yan:
首先 Rust 是一种非常好的编程语言,在过去 6-7 年的 StackOverflow 调查中一直是最受欢迎的语言之一。Rust 非常优美且强大,被广泛用于系统编程,包括操作系统、数据库和区块链。它也是智能合约的绝佳语言,因为 Rust 首要考虑的就是安全性。其设计支持类型安全、内存安全,并且不存在各种未定义行为,这使它成为一个非常可靠的智能合约语言。
此外,Rust 还拥有一个非常强大的工具包,包括各种编码和优化工具,以及用于测试产品的调试和代码覆盖工具。但是,Rust 的学习曲线比较陡峭,不太容易学习。这是一件好事,因为它可以提高工程技能和实践。使用 Rust 的开发者通常有良好的背景和基础技能,相比其他语言,他们会出现更少错误。
此外,Rust 受到攻击的可能性也更小。事实上,在 NEAR 协议及使用 Rust 作为智能合约语言的其他区块链中,Rust 受到的攻击更少。这是因为了解 Rust 的攻击者更少,攻击者也更难理解代码和在 Rust 中找到问题。
总体来说,Rust 是智能合约开发的优秀语言,由于其安全性和可靠性,其热度一直在不断上升。关于 NEAR,我们做了很多设计工作,让 NEAR 的智能合约开发体验更简单更高效。这使得我们有可能用最低的成本开发出世界级的顶级项目。
在安全方面,首先要提到 NEAR 使用了一个非常灵活强大的命名账户模型。这与其他区块链形成对比,在其他区块链中,仅根据合约地址哈希无法识别合约的身份。使用 NEAR,只要看一眼账号就可以轻易识别出合约身份,这使得用户更难受到钓鱼攻击。
另外,NEAR 具有分片设计,需要异步的跨合约调用,这在实现上可能有些挑战,但可以使攻击系统变得更困难。特别是在进行错误处理以撤销某些状态时,我们需要了解其工作原理,并使用回调函数来确保状态保持一致。异步跨合约调用还使其他区块链中的闪电贷攻击在 NEAR 上几乎不可能。
第三,我们拥有设计良好的 NEAR Rust SDK。我认为它是与其他区块链相比最好的 Rust 智能合约之一。它使测试变得容易,有利于构建高质量产品,并使用我们设计的 Bosch 标准实现了二进制序列化和反序列化的标准化,该标准既强大又高效。我们还有许多其他构建块,例如经过充分测试的 FT 和 NFT 合约标准,以及 NEP 标准和升级。这对开发者来说非常有帮助,可以用几行代码开始编码。
最后,我想提到我们拥有 DAO 控制的远程合约升级流程,这非常有趣,因为在 Solidity 中进行升级在一定程度上可能具有挑战性。但是,使用 NEAR,每个合约都被设计成可升级的。我们可以使用 DAO 来控制该合约的可升级性,并且可以快速安全地执行各种升级。
Claudio Cossio:
我们决定在 NEAR 上构建的主要原因之一,是因为可以实现在 DAO 上运行智能合约。对我们的技术联合创始人 Lucia 来说,这一点特别重要,她是我们流动质押衍生品平台背后的设计大师。流动质押智能合约必须是非托管的,这意味着用户始终控制自己的资产。这是有意设计的,并且是我们近两年前启动时的一个关键功能。即使智能合约被黑客攻击,用户的资产也不会受到损害,他们可以自己采取必要行动。我们会提供机制供他们这样做。尽管可升级性有其利弊,但在 NEAR 上构建一个智能合约之上的 DAO 可以使攻击者更难获得流动质押智能合约的控制权。在基于 Rust 的 NEAR 上,智能合约是可升级的,不需要分叉合约或快照。我们已经对智能合约进行了四次升级,得益于我们所依赖的基于 Rust 的技术栈,四次升级过程很平稳,用户资金都非常安全。
在安全方面,我们与 BlockSec 合作进行安全审计,因为他们曾与 NEAR 核心团队,以及我们在 NEAR 上的 DeFi 合作伙伴 Ref Finance 合作。所以我相信 BlockSec 是完整理解 NEAR 生态的,Lucia 是 NEAR 上排名前 10 的开发者之一,她能够参与细节的审计让我们很安心,这些都是我们选择合作伙伴时非常看重的要素。我们同意 Matthew 的观点,我们不应该急于将项目推向主网,因为用户将他们信任的 NEAR、OCT 或 META 放在我们正在部署的项目上。我们要确保开发足够成熟,让主网稳定安全地运行,无惧不法分子的窥探,这非常重要。
在技术栈方面,攻击者需要先进的技术才能攻击 NEAR 上的智能合约,这使其成为一项非常困难的任务。如果智能合约开发不当,可能留下容易受攻击的漏洞。因此,拥有像 Lucia 这样的技术联合创始人至关重要。
Louis:
在构想 Octopus Network 架构的时候,我们力求围绕一个现有的、繁荣的 DeFi 密集型的公链,去构建一个多链网络,而不是围绕一个极简的 Relayer 或者 Hhub。这使得章鱼网络生态的应用链,能够从第一天开始利用和组合 DeFi 协议。
我们没有以 Layer1 区块链的形式去实现多链网络的枢纽,而是以 NEAR 上智能合约的形式来实现。得益于 NEAR SDK 和 Rust 语言的强大功能,我们在相对短的时间内就实现了这个目标。 Octopus Network 的第一个版本在一年内就完成了主网上线,实现了共享安全和互操作性。这个第一版本包含了 7000 行代码,我认为当时这是 NEAR 上最复杂的智能合约之一,但与 Polkadot relayer 或 Cosmos hub 相比还是小了两个数量级。这使它异常的强大,Octopus Network 经过 Halborn、BlockSec 等专业审计合作伙伴的安全审计,并且在过去两年中没有发生任何安全事故。
我们正在迈向 Octopus2.0,预计会有更多资产,我们引入了 $NEAR Restaking 模式。极大的扩大了共享安全提供方,我们会在 NEAR 和 Cosmos 生态系统之间建立桥梁,在资产越来越多的情况下,安全压力也逐步的变大。但我认为通过利用过去 2~3 年获得的经验,在 BlockSec、NEAR 以及生态内共享的安全经验,我们可以克服这一挑战。
总体来说,我对我们即将到来的 Octopus 2.0 充满信心。
Vivi:与其他语言和生态系统相比,NEAR 项目的审计有何不同?
Matthew Jiang:
Rust 和 Solidity 之间的第一个区别来自语言本身。Rust 与 Solidity 完全不同, Rust 更复杂,审计更具挑战性。而且因为 Rust 的强大能力,即使是相同的功能,不同的开发者编写的代码风格也可能有很大差异。
另一个区别来自 NEAR 协议的具体特性。NEAR 引入了许多以太坊中没有的优秀特性。例如,由于 NEAR 的异步特性,开发人员需要添加回调函数以确保正确处理状态回滚。许多最近加入 NEAR 生态系统的开发人员可能不理解此特性,因此我们需要花费大量时间和精力进行教育。特别是当项目非常复杂时,即使经验丰富的开发人员也可能在这一点上犯错。
将 Rust 与 Solidity 区分开来的另一点是 Rust 提供了许多 SDK,一些由 NEAR 维护,一些由第三方维护。不同于 Solidity,以太坊中的大多数合约代码都是从零开始编写的,即使开源库提供了一些代码,但是大多数代码仍然是开发人员自己编写的。在 NEAR 中编写智能合约时,可以始终导入这些 SDK。在这种情况下,我们必须查看此维护的所有更新,以确保我们在同一页面上,用户正在使用软件包的正确版本。
Vivi:在项目审计时,项目团队会有什么样的收获呢?有没有一些例子或者故事可以分享吗?
Matthew Jiang:
Octopus2.0 的审计还在进行中。
与此同时,我们还在审计 Meta Pool,发现一个很关键的,会导致资金池耗尽的潜在问题,现在正在得到解决。这其中原因,主要是由于 NEAR 协议的异步特性,让一些在以太坊中会被回滚的状态,在 NEAR 中会呈现出一些不同的情况。
免责声明:本文仅供参考,不得被用作法律、税务、投资、理财或任何其他建议。
| 往期精选 |
NEAR will be a Cosmos zone SOON
通过 Substrate-IBC 实现 Substrate 资产跨链
Louis 谈 dYdX “叛逃”以太坊
专用预言机 -- Substrate 应用链独有设计模式
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。
