介绍 sCrypt:BTC 的 Layer-1 智能合约框架

news2024/11/30 13:51:05

在 TypeScript 中开发 BTC 智能合约

我们非常高兴地推出 sCrypt:一种现代 Typescript 框架,用于在 BTC 上开发第一层智能合约,无需分叉。 现在,人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合约。 任何 web2 开发人员都可以在 BTC 上开发智能合约驱动的应用程序,只要她了解 JavaScript/TypeScript。 它为将 BTC 转变为智能合约平台奠定了坚实的基础。

BTC 上的智能合约

传统上,比特币被认为只能支付和存储价值。 Ordinals 通过证明它也支持令牌来改变这种误解。 另一个误解是比特币缺乏智能合约功能。 事实上,BTC 从第一天起就以比特币脚本的形式支持智能合约。 哈希锁、时间锁和多重签名是一些突出的例子。

BTC 智能合约的最大障碍之一在于脚本。 作为一种低级汇编语言,Script 非常难以编码和推理。 实际上没有像典型软件开发工作流程那样的测试、调试和部署工具。 用原生脚本编写智能合约既麻烦又容易出错。 当合约规模和复杂性增加时,它很快就会变得棘手。

sCrypt

输入密码。 借助 sCrypt,开发人员可以直接使用 Typescript 编写 BTC 智能合约,Typescript 是世界上最流行的编程语言之一,每天都有数百万开发人员使用。 sCrypt 合约被编译成比特币脚本。

sCrypt 提供了很多好处:

无需学习新的编程语言。 我们选择 TypeScript 是因为它提供了一种简单、熟悉的语言 (JavaScript),而且具有类型安全性,可以轻松开始编写安全的智能合约。 如果您已经熟悉 TypeScript/JavaScript,则无需学习新的编程语言或工具。

无需学习新工具。 Web2 开发人员可以重用数百万现有的 TypeScript/JavaScript 库和他们最喜欢的工具:用于 IDE 的 Visual Studio Code/WebStorm、用于包管理的 NPM、用于测试的 Jest/Mocha/Jasmine。

一个有效示例

让我们来看看一个实用的智能合约。

下面的代码代表了 BitVM 的简单逻辑 NAND (NOT-AND) 门承诺,取自其白皮书中的图 2。 它检查门的两个输入位 (A, B) 和一个输出位 (E)(全部使用哈希值提前提交)是否匹配,即 E = NAND(A, B)

该代码如何工作的具体细节并不重要。 这里的中心信息是,它与现代编程语言的样子相去甚远,而且显得深奥。

// Reveal Preimage of hashE0 or hashE1
<hashE0/1>
OP_BITCOMMITMENT
OP_TOALTSTACK
// Now the bit value of "E" is on the stack
// Reveal Preimage of hashB0 or hashB1
<hashB0/1>
OP_BITCOMMITMENT
OP_TOALTSTACK
// Now the bit value of "B" is on the stack
// Reveal Preimage of hashA0 or hashA1
<hashA0/1>
OP_BITCOMMITMENT
OP_TOALTSTACK
// Now the bit value of "A" is on the stack
//
// Verify that "A NAND B == E"
//
// Read "B" from alt stack
OP_FROMALTSTACK
// Compute A NAND B
OP_NAND
// Read "E" from alt stack
OP_FROMALTSTACK
// Check A NAND B == E
OP_EQUALVERIFY
脚本中的 NAND 门承诺

功能上的等价物在 sCrypt 中简单地表示为:

const bitA = BitVM.bitCommit(this.hashPairA, preimageA)
const bitB = BitVM.bitCommit(this.hashPairB, preimageB)
const bitE = BitVM.bitCommit(this.hashPairE, preimageE)
assert(BitVM.nand(bitA, bitB) == bitE)

比较 Script 和 sCrypt 实现,很明显后者对于现代开发人员来说更加友好和平易近人。 前者只有少数能够使用过时的汇编语言进行编码的开发人员知道,而后者可以由数百万了解 JavaScript/TypeScript 或任何其他面向对象编程语言(例如 Java、C++ 或 Golang)的开发人员掌握。 智能合约越复杂,用 sCrypt 开发比用 Script 开发就越有利。

下面列出了基于 sCrypt 库 scrypt-ts-btc 的完整代码。

import {
    assert, ByteString, hash160, method, prop, Ripemd160, SmartContract,
} from 'scrypt-ts-btc'

type HashPair = {
    hash0: Ripemd160
    hash1: Ripemd160
}

export class BitVM extends SmartContract {
    @prop()
    hashPairA: HashPair
    @prop()
    hashPairB: HashPair
    @prop()
    hashPairE: HashPair
    
    constructor(hashPairA: HashPair, hashPairB: HashPair, hashPairE: HashPair) {
        super(...arguments)
        this.hashPairA = hashPairA
        this.hashPairB = hashPairB
        this.hashPairE = hashPairE
    }
    
    @method()
    public openGateCommit(
        preimageA: ByteString,
        preimageB: ByteString,
        preimageE: ByteString
    ) {
        const bitA = DemoBitVM.bitCommit(this.hashPairA, preimageA)
        const bitB = DemoBitVM.bitCommit(this.hashPairB, preimageB)
        const bitE = DemoBitVM.bitCommit(this.hashPairE, preimageE)
        assert(DemoBitVM.nand(bitA, bitB) == bitE)
    }
    
    @method()
    static bitCommit(hashPair: HashPair, preimage: ByteString): boolean {
        const h = hash160(preimage)
        assert(h == hashPair.hash0 || h == hashPair.hash1)
        return h == hashPair.hash1
    }
    
    @method()
    static nand(A: boolean, B: boolean): boolean {
        return !(A && B)
    }
}

BitVM 合约

部署和调用智能合约

我们使用 Pay-to-Witness-Script-Hash (P2WSH) 进行合约部署。 部署包括编译智能合约代码以生成脚本、对该脚本进行哈希处理,并将哈希值放入 P2WSH 交易 (Tx0) 中,该交易将广播到网络。

当有人想要调用已部署的合约时,她将嵌入完整的合约脚本以及被调用方法的输入,作为后续交易(Tx1)中花费 Tx0 的见证数据。

部署和调用交易:左边代表输入,右边代表输出

以下是部署和调用合约的代码片段:

await BitVM.loadArtifact()

// instantiate a new contract
const instance = new BitVM(hashPairA, hashPairB, hashPairE)
await instance.connect(getDefaultSigner())

// deploy with 1000 sats
const deployTx = await instance.deploy(1000)
console.log(`Deployed contract "DemoBitVM": ${deployTx.id}`)

// call contract
const callRes = await instance.methods.openGateCommit(preimageA, preimageB, preimageE)
console.log(`Called "openGateCommit" method: ${callRes.tx.id}`)

部署和调用

值得注意的是,部署(第 8 行)和调用(第 12行)合约只需要一行。

部署交易 ID:

a651b22a8fc6d424233d94087d89744694f7710f175d9cd6fe2a0f66b3b35227

调用交易ID:

fa06d0f10f2642f9f677c105970559b15e8d9281e744b5ddc1da49fafc15b9d7

这些交易 ID 代表在 BTC 上部署和调用的 BitVM 合约的实例。

该示例的完整代码可在 GitHub 上找到。 有兴趣的开发人员可以访问完整的代码并自行运行。 有关 sCrypt 的更多信息,请参阅我们的详细文档。

已知限制

sCrypt 可以在任何支持比特币脚本的区块链上运行。 这包括比特币分叉和比特币衍生链,例如莱特币和Doge。

BTC 禁用了 OP_CATOP_MUL 等许多 Script 操作码,极大地限制了 sCrypt 可以表达的智能合约类型。 BTC 社区正在积极讨论重新启用此类操作码并引入新的操作码,如果提议的更改被接受,这将使 BTC 上的 sCrypt 比现在更强大。

与此同时,有些链拥有全套脚本操作码,例如 Bitcoin SV 和 MVC。 sCrypt 今天在这些链上达到了其全部能力。

在Taproot中使用

为了便于在示例中进行说明,我们使用 P2WSH 类型脚本嵌入 sCrypt 合约,该脚本允许最大脚本大小为 10KB。 sCrypt 合约也可以在 Taproot 脚本中使用。 它们可以变得更具表现力和复杂性,因为 Taproot 的脚本大小限制更大,约为 4MB。

相关工作

与其他 Layer-1 (L1) 比较

还有其他一些尝试来提高脚本的可编程性,我们在下面列出了一些。

  • Miniscript:一种独立的语言,用于以可组合且可读的方式表示比特币脚本。 它的范围非常有限,并且表达能力不如脚本:它只能表达签名要求、时间锁、哈希原像以及这些的任意组合。
  • Simplicity:一种正在开发的低级编程语言,比比特币脚本具有更大的灵活性和表现力。 它需要一个分叉才能在 BTC 上实现。

与这两者相反,sCrypt 并没有发明一种新的编程语言,只是重用了 TypeScript,它的学习曲线明显更浅。 它还提供了除智能合约语言之外更全面的框架,包括 IDE、包管理、调试器、SDK 和 API。 也就是说,它提供了开发人员构建由智能合约支持的全栈应用程序所需的一切。

与第 2 层 (L2) 比较

sCrypt 是一种基于 Typescript 的领域特定语言 (DSL),编译为比特币脚本,目前无需任何分叉即可在 BTC 上运行。 它继承了 BTC 的全部安全性,从而使其比任何 BTC L2 都更加安全和去信任。

话虽如此,如果 BTC L2 也使用脚本并启用比 BTC L1 更多的操作码,那么 BTC L2 可以使用更多的 sCrypt 功能。 事实上,已经有 L2 以这种方式利用 sCrypt,例如 Note Protocol。

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

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

相关文章

leetcode—搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

Android studio第一次构建项目Gradle失败的解决方法

每次在AS上新创建一个项目&#xff0c;gradle要下载半天或者是直接下载半天后以失败告终&#xff0c;抓狂并崩溃。 原因&#xff1a; 这是因为AS默认去下载gradle的网站是在国外的&#xff0c;而且国内的网络经常是访问不到那个网站的&#xff0c;能访问到有时候就跟中大奖一…

Docker之网络配置的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之网络配置的使用》。&#x1f3af;&…

鼠害监测站特点有哪些

【TH-SH2】草原鼠害智能监测设备是一种利用先进的传感技术来准确捕获鼠患行为的设备&#xff0c;它能够实时报警并迅速采取有效措施以遏制草原灾变&#xff0c;从而保障草原生态平衡并维护生态环境的可持续发展。这种系统融合了机器视觉、模式识别、大数据和深度学习等技术&…

网站高可用架构设计基础

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、网站高可用概述 不要尝试着去避免故障&#xff0c;而是要把处理故障的代码当成正常的功能做在架构里写在代码里。 高可用是一种面向风险设计&a…

if单分支,二分支,多分支,语句嵌套,while语句,for语句(Python实现)

一、主要目的&#xff1a; 1&#xff0e;熟悉程序设计结构的三种方式 2.掌握if单分支语句、if二分支语句、if多分支语句及if语句嵌套的使用方法 3.掌握while语句的使用方法 4.掌握for语句的使用方法 5.掌握循环嵌套的使用方法 二、主要内容和结果展现&#xff1a; 1&…

Angular系列教程之管道

文章目录 管道的基本概念使用内置管道创建自定义管道总结 在Angular中&#xff0c;管道&#xff08;Pipe&#xff09;是一个非常重要的概念。它们允许我们对数据进行转换、格式化和显示&#xff0c;并且可以轻松地在模板中使用。本篇文章将介绍Angular中的管道概念&#xff0c;…

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…

财务分析要使用PowerBI,VBA,Python,学习那个可以对财务工作更加有益?

1.简要分析几款工具的特点 &#xff08;1&#xff09;PowerBI&#xff1a;微软开发的一款商业智能工具&#xff0c;主要用于数据可视化、报表制作和数据分析。 &#xff08;2&#xff09;VBA&#xff1a;Excel中的一种宏编程语言&#xff0c;用于自动化Excel操作和开发自定义…

使用R从高程相对坐标数据生成tif图层的详细方法及代码

要将区域地理高程数据转化为图层&#xff0c;您可以使用R语言中的一些地理信息系统&#xff08;GIS&#xff09;库和工具。以下是一个简单的步骤&#xff0c;使用raster包来生成tif图层&#xff0c;假设您已经有了高程相对坐标数据。 安装和加载必要的R包&#xff1a; instal…

1、node.js安装

文章目录 node.js下载及安装node.js安装验证node执行js代码 node.js下载及安装 https://nodejs.org/en 访问官网&#xff0c;下载LTS版本 下载完成后&#xff0c;双击安装&#xff0c;安装过程基本不用动什么&#xff0c;包括盘符也尽量不要改。 node.js安装验证 cmd运行nod…

论文阅读 Self-Supervised Burst Super-Resolution

这是一篇 ICCV 2023 的文章&#xff0c;主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务&#xff0c;这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据&#xff0c;而且模…

C#,字符串匹配(模式搜索)Boyer Moore算法的源代码

Boyer Moore 算法是字符串匹配&#xff08;模式搜索&#xff09;的主要高效算法之一。 Boyer-Moore&#xff08;BM&#xff09;算法被认为最高效的字符串搜索算法&#xff0c;它由Bob Boyer和J Strother Moore于1977年设计实现。通常情况下&#xff0c;Boyer Moore 算法比KMP算…

【MIdjourney】几种独特的艺术风格

1.合成器波(Synthwave) Synthwave是一种音乐风格&#xff0c;起源于20世纪80年代电子音乐和电影的复古元素。这种音乐风格通常包括合成器音乐、电子鼓声和强烈的电子声效&#xff0c;以模拟80年代电影和视频游戏的声音。Synthwave的特点包括浓厚的合成器声音、强烈的节奏和对复…

2024年10大指纹浏览器推荐,不踩雷浏览器盘点

跨境安全离不开纯净代理与指纹浏览器的强强结合。在过去一年&#xff0c;IPFoxy纯净代理配合各大指纹浏览器完成了数千跨境账号的安全防护与高速浏览活动。结合广大用户真实体验与反馈&#xff0c;为大家盘里2024年最值得选择的十大指纹浏览器&#xff01; 1、AdsPower AdsPo…

postman案例

一、表单接口 基本正向 有效反向 无效反向 JSON接口 基本正向 有效反向 无效反向 文件上传接口 token 获取token值 一&#xff1a; 二&#xff1a; Bearer 获取的token的值&#xff0c;至于鉴权方式要根据swagger接口文档要求

医用一次性防护服行业研究:未来市场需求量继续巨大

目前&#xff0c;国标医用防护服生产大多采用环氧乙烷灭菌&#xff0c;但最大的缺点是需要很长时间通风以去除残留&#xff0c;整个灭菌时间较长&#xff0c;通常需要7-14天&#xff0c;而采用钴60或电子加速器辐照灭菌&#xff0c;无污染、无残留&#xff0c;不含有放射源&…

《计算机视觉处理设计开发工程师》

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

【Python3】【力扣题】389. 找不同

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;使用计数器分别统计字符串中的元素和出现次数&#xff0c;两个计数器相减&#xff0c;结果就是新添加的元素。 知识点&#xff1a;collections.Counter(...)&#xff1a;字典子类&#x…

leetcode—矩阵

1 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 方法一&#xf…