Web3.0安全开发实践:9个sCrypt智能合约开发的最佳实践

news2024/12/25 2:57:39

sCrypt是一种基于TypeScript的嵌入式领域特定语言(eDSL),专为在比特币链上编写智能合约而设计。sCrypt智能合约使用比特币支持的操作码,可以编译成Bitcoin Script。由此生成的类似汇编的脚本可用作交易中的锁定脚本。

本文将探讨sCrypt智能合约背后的概念,以及使用sCrypt编程的一些最佳实践和安全检查清单。

使用sCrypt编写编写智能合约:一个简单示例

比特币上的智能合约使用UTXO模型,每笔比特币交易由输入和输出组成,每笔比特币交易由输入和输出组成:

输出包含:

  • 比特币的数量

  • 字节码(称为locking script,“锁定脚本”)

输入包含:

  • 对上一笔笔交易输出的引用

  • 字节码(unlocking script,“解锁脚本”)

未花费交易输出(UTXO)是指在任何交易中尚未被消耗消耗的输出。低级字节码/操作码,称为Bitcoin Script,由比特币虚拟机(BVM)解释执行。

比特币支持的操作码可以编译为Bitcoin Script。生成的类似汇编的脚本用作交易中的锁定脚本。

如上图展示的两个交易,每个交易都有一个输入(绿色)和一个输出(红色)。右侧的交易使用了左侧交易的输出。锁定脚本可以视为一个布尔函数f(x),它定义了花费UTXO中比特币的条件,起到“锁”的作用(因此称为“锁定”)。解锁脚本则提供了使f(x)结果为true的函数参数,充当“钥匙”(也称为见证)来解锁它。只有当输入中的“钥匙”与先前输出的“锁”匹配时,才能花费该输出中包含的比特币。

在标准的比特币支付中,锁定脚本是“Pay To Pubkey Hash”(P2PKH)。它用于验证付款人是否拥有与地址对应的正确私钥,从而使他们能够在解锁脚本中生成有效的签名。sCrypt语言使得锁定脚本可以指定比简单的P2PKH更加复杂的花费条件,即P2TR/P2SH交易中的比特币智能合约。

sCrypt的智能合约在概念上类似于面向对象编程中的类。每个包都为特定类型的合约(例如P2PKH或多签名)提供了模板,可以实例化为具体的可执行合约对象。

部署和调用sCrypt智能合约

sCrypt使用支付到见证脚本哈希(Pay-to-Witness-Script-Hash,P2WSH)来部署合约。部署过程包括将智能合约代码编译成脚本,对该脚本进行哈希处理,然后将哈希值放入一个P2WSH交易(Tx0),并将其广播到网络。

当有人要调用已部署的合约时,他们会将完整的合约脚本和被调用方法的输入作为见证数据嵌入到花费Tx0的后续事务(Tx1)中。

部署和交易调用:左侧表示输入,右侧表示输出

已知的sCrypt局限性

sCrypt可以在任何支持Bitcoin Script的区块链上运行,包括比特币分叉链和基于比特币的链,如Litecoin和Dogecoin。

比特币禁用了许多脚本操作码,如OP_CAT和OP_MUL,这极大地限制了sCrypt能表述的智能合约类型。比特币社区正在积极讨论重新启用这些操作码并引入新的操作码。如果变更的提议得到采纳,sCrypt在比特币上的功能将比现在更强大。

与此同时,有些区块链具备完整的脚本操作码,例如比特币SV和MVC。如今,sCrypt在这些链上已达到满负荷运行。

回溯至创世问题(Back-to-Genesis)

使用sCrypt的智能合约实现同质化代币(FT)和非同质化代币(NFT)时,会引发回溯至创世(Back-to-Genesis,B2G)问题,这是一个极大的安全挑战。该问题涉及在基于UTXO的区块链中追踪代币的创建交易。在比特币等区块链上,通过sCrypt创建的代币以UTXO形式存在,并可能被频繁转移。B2G问题的关键在于,当试图追踪或验证代币的完整历史记录时,需要找到其创世交易,以确认代币的来源和真实性。

从各种角度上来说,这一点很重要。包括:

  • 来源和真实性:了解代币的完整历史可以让用户验证其真实性和来源。用户可能希望确保代币有一个合法且可追溯的来源。

  • 智能合约逻辑:智能合约或去中心化应用可能会依赖于代币的历史。了解代币的来源对于某些智能合约功能至关重要。

下图展示了伪造基于sCrypt的FT和NFT的两种方法。每个框代表一个交易,左侧是输入,右侧是输出。箭头指向表示从一个交易到另一个交易的流转过程。具有相同输出颜色的交易使用相同的合约代码。

Back-to-Genesis问题可能会引发代币协议中的两个问题:

  • 重放攻击(Replay Attack):攻击者可能会重新发行相同的代币。

  • 中间人攻击(Man-in-the-Middle Attack):攻击者可以从一个不相关的UTXO开始,并复制一个代币交易链。他们可以复制交易的输出(如第1行所示),并将其逐字粘贴到另一个交易中(如第3行所示)。这种情况之所以可能发生,是因为锁定脚本仅在解锁时进行评估,而不是在部署时进行评估。从那时起,交易就可以用来创建一个并行的虚假代币链。

解决方案

在这些场景中,交易因为满足Layer-1的验证而被矿工接受。被红色圆圈标记的最后几笔交易看起来完全相同。验证代币交易合法性的唯一方法是追溯到其发行交易(即创世交易)。

为了解决重放攻击,我们建议实施一个全局唯一的ID,“GenesisID”,它代表发行交易的交易ID(txid)。当发行UTXO被消费时,该ID会被复制,并作为代币ID保留在所有后续代币传输UTXO中。

使用发行交易的TXID作为唯一的TokenID

为了减少中间人攻击,我们建议开发者在当前交易之前回溯两步,验证父交易及其前一交易。

以下是一个简单的示例,用于说明回溯验证以及提前两步验证的重要性:

提前两步验证

当伪造的UTXO(UTXO1)被花费到另一个代币UTXO(UTXO2)时,由于代币合约并未被激活(UTXO的锁定脚本仅在解锁时执行),所以它会通过矿工验证。然而,在我们建议的实现中,尝试将UTXO2存入UTXO3需要同时验证UTXO1和UTXO2。这样,中间人攻击就失败了,因UTXO1不包含与UTXO2和UTXO3相同的解锁合约,交易将因此被拒绝。

sCrypt安全提示与检查清单

以下是CertiK在完成对一个基于sCrypt的FT/NFT项目审计后总结的安全提示和检查清单:

1. 验证代币的回溯是否准确,当前UTXO的锁定脚本代码段是否与前一个UTXO的匹配

sCrypt团队提供了一个示例,可以帮助开发者设计回溯验证流程:

2. 确保协议不会受到伪造创世ID的攻击

这可以通过在回溯过程中验证创世ID来实现,如下例所示:

检查应确认当前的genesisTxid是否与创世交易的ID或前一个交易的ID匹配。

3. 确认UTXO输入证明真实合法,而非伪造

必须验证以下参数:

  • tokenTxHeader

  • prevTokenInputIndex

  • tokenTxInputProof

  • prevTokenTxProof

我们建议开发者在验证UTXO输入证明时遵循此流程图。

4. 确保代币解锁过程已得到适当授权

代币可以由代币所有者直接解锁,也可以通过代币锁定合约进行解锁。代币所有者必须通过有效的签名验证其所有权,以解锁代币。如果通过智能合约解锁代币,必须遵守合约中规定的任何条款或限制。请注意,禁止解锁被烧毁的代币。

5. 确保代币转移UTXO中的代币数量保持一致,以防止双花攻击

已解锁的代币可以转移到一个或多个接收钱包。重要的是确保作为输入的代币总量等于作为输出的代币总量。换句话说,正在转移的代币必须与可用的代币相匹配,以保持平衡。通过强制执行这一要求,合约能够防止双花攻击的可能性。

6. 验证是否选择了适当的SigHash类型,明确指定交易的哪些部分被签名

SigHash标志决定了加密签名涵盖比特币交易中哪些部分。默认情况下,使用SIGHASH_ALL标志,确保签名涵盖所有输入和输出。然而,选择不同的SigHash类型时需要谨慎。例如,SIGHASH_NONE标志不会签署任何输出,这就可能引入安全漏洞。应用签名后可更改的输出可能会导致欺诈或操纵。

7. 验证合约完整性

在比特币的UTXO模型中,智能合约通常是一次性且无状态的。这是因为包含合约的UTXO一旦用完就会被销毁,且不会在区块链上留下痕迹。尽管这种设计简单高效,但也存在安全风险,因为合约可能会被篡改。为此,需要验证合约脚本代码的哈希值,这包括将脚本的哈希值嵌入到脚本数据中。在交易过程中,将嵌入的哈希值与脚本的实际哈希值进行比较,即可确认脚本的完整性。

为了应对挑战,一种方法是验证合约脚本代码的哈希值。这种方法需要将脚本的哈希值作为数据的一部分保存在脚本内部。在执行涉及智能合约的交易时,可以将脚本代码的哈希值与存储的值进行比对。如果哈希值匹配,则确认合约脚本未发生变化,未被篡改。

8. 验证交易完整性

sCrypt提供了一个强大的库叫做Tx,除了锁定脚本和解锁脚本外,还能检查包含合约本身的整个交易。sCrypt通过这一全面的交易检查功能,使合约能够验证输入数据。

主要验证步骤之一是将解锁脚本的输入与从交易预映像中提取的数据进行匹配。此外,还需要验证txPreimage是否为当前交易的预映像。

9. 验证数据完整性

在输出的锁定脚本中,智能合约被分为两个部分:代码和状态。合约的状态存储在锁定脚本的数据部分。在协议本身管理数据部分的场景中,必须特别注意数据字段的处理。至关重要的是,必须要验证存储在锁定脚本数据部分的数据字段是否在正确的位置索引上进行访问和存储。

总结

综上所述,sCrypt作为一种比特币智能合约开发语言,为开发者提供了丰富的可能性。从回溯验证到防伪造代币和完整性检查,本文总结的安全提示与最佳实践建议,来源于业内领先的审计机构与开发者的实际经验。希望这些内容能够为开发者提供有价值的参考,助力构建更加安全、高效的Web3.0应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手SEO指南如何快速入门与提升网站排名

内容概要 搜索引擎优化(SEO)是提高网站可见度和排名的重要手段,尤其对新手来说,掌握其基本概念和实用技巧至关重要。本文将针对新手提供一系列的指导,帮助你快速入门并逐步提升网站排名。 首先,了解SEO的…

【EthIf-14】EthIfGeneral容器配置-02

1.实际EthIfGeneral的配置实例 关闭DET接口开启发送确认中断开启接收中断主周期接收timeout主周期 2. 代码实例参考 阅读此部分代码,搞清楚代码分为几个section,大概瞄一眼就好,不用深究其含义,只需有一个宏观的层次结构的映像即可。 //Appl/GenData/EthIf_Cfg.h #

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…

Docker 部署 SpringBoot VUE项目

是一套基于若依的wms仓库管理系统 一、后端部署 后端地址:https://gitee.com/zccbbg/wms-ruoyi/tree/v1/ 1、用IDEA拉代码,并修改API统一后缀 2、复制一个配置文件 application-dev.yaml,并修改里面的mysql与redis配置 3、将打包的jar上传…

面试基础篇---迭代器,yield, tcp, 等

1.谈谈python的装饰器,迭代器,yield? 迭代器在内存中通常是一次性遍历的,也就是说,一旦遍历完所有元素,它就会停止工作,不可再用。 惰性计算:生成器按需生成数据,即只有在…

【文档搜索引擎】搜索模块的完整实现

调用索引模块,来完成搜索的核心过程 主要步骤 简化版本的逻辑: 分词:针对用户输入的查询词进行分词(用户输入的查询词,可能不是一个词,而是一句话)触发:拿着每个分词结果&#xf…

帝国cms灵动标签调用相关文章

帝国cms相关文章调用的方法很多,官方默认调用方法是使用标签 [!--other.link--] 那么内容页调用相关文章,什么时候用到灵动标签呢 答案是调用同类型的文章,比如有相同关键词或者相同tags标签的文章 使用灵动标签是如何调用的呢&#xff0…

低空经济的地理信息支撑:构建安全、高效的飞行管理体系

随着无人机等低空飞行器的广泛应用,低空空域管理的重要性日益凸显。地理信息技术作为低空空域管理的重要支撑,对于保障低空经济的健康发展具有不可替代的作用。 地理信息技术在低空空域管理中的作用 地理信息技术在低空空域管理中扮演着关键角色&#x…

一体式IO模块:打印机加工产线国产化降本增效的新利器

在当今全球化的市场竞争中,打印机制造行业面临着前所未有的挑战与机遇。为了提升生产效率、降低成本,并加速国产化进程,各大打印机制造商纷纷寻求技术创新与升级。明达技术自研推出的MR20一体式IO模块作为工业自动化领域的核心组件&#xff0…

「下载」智慧产业园区-数字孪生建设解决方案:重构产业全景图,打造虚实结合的园区数字化底座

数字孪生技术作为一种创新的管理工具,正逐步展现出其在智慧园区建设中的重要意义。以下将从几个方面详细阐述数字孪生在智慧园区建设中的关键作用。 一、提升园区运营管理的智能化水平 数字孪生技术通过构建园区的虚拟镜像,实现了对园区物理世界的全面…

ICASSP 2025 中了 ,不去印度参会就撤稿?

近日,ICASSP 2025正式放榜,身边很多同学都收到了好消息,虽然目前官方还没有给出正式的数据,但据知情人士透露,今年的投稿编号超过8000,可以说是创造了历史新高,预测整体录取率在46%左右。 根据…

深度学习之目标检测——RCNN

Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法:穷举法,在原始图片上进行不同尺度不同大小的滑窗,获取每个可能的位置 弊端:计算量大,且尺度不能兼顾 Selective …

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS(视距)和 NLOS(非视距)环境下的定位系统,估计目标的动态位置,三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位: 50个点的轨迹定位&#…

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商

吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程分为两大部分:面向全体团队成员的AI大模型技术结构与行业应用,以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…

专业的内外网数据交换方案 可解决安全、效率、便捷3大问题

内外网数据交换是很多企业和行业都会面临的场景,既然隔离了内外网,重中之重就是要确保数据的安全性,其次在数据流转交换过程中,不能太繁琐复杂,需要让用户快速、便捷的进行数据交换。首先我们来看看,在进行…

【linux】NFS实验

NFS服务 NFS是Network File System(网络文件系统)的缩写。它是一种用于在计算机网络中共享文件和目录的协议。NFS允许计算机上的用户访问和操作远程计算机上的文件,就像访问本地文件一样。它使用客户端-服务端模型,其中客户端机器…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好,我是Python老安,今天为大家带来的是Windows Python3下载、安装教程,适用于 Python3 所有版本,包括 Python3.7,Python33.8,Python33.10 等版本。希望对大家有所帮助 Python目前已支持所有主流操作系统,在Linux,…

职业技能赛赛后心得

这是一位粉丝所要求的,也感谢这位粉丝对我的支持。 那么本篇文章我也是分成四个部分,来总结一下这次赛后心得。 赛中问题 那么这里的赛中问题不会只包含我所遇到的问题,也会包含赛中其他选手出现的问题。 那么首先我先说一下我在赛中遇到的…

WordPress File Upload 插件 任意文件读取漏洞复现(CVE-2024-9047)

0x01 产品简介 WordPress File Upload插件是一款功能强大的WordPress站点文件上传插件,它允许用户在WordPress站点中的文章、页面、侧边栏或表单中轻松上传文件到wp-contents目录中的任何位置。该插件使用最新的HTML5技术,确保在现代浏览器和移动设备上都能流畅运行,同时也…

没想到互联网大厂都喜欢问MySQL中的数据类型?

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…