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

在 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…

大创项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

第三届iEnglish全国ETP大赛展现教育游戏新趋势

随着社会步入数字化纪元,游戏作为信息交流和传播的重要载体,在教育领域的潜能日益凸显。特别是寓教于乐的“教育游戏”学习方式让更多家长和孩子体验到“玩中学,学中玩”的乐趣,在教育领域的潜能也日益凸显。 本周五(1月19日)晚上7点,国内首个教育游戏赛事、以“玩转英语,用iE…

Docker之安装Nginx

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

瑞_JVM虚拟机_概述

文章目录 1 什么是JVM1.1 JVM功能1.2 常见的JVM1.3 常见的JVM: Java虚拟机规范1.4 常见的JVM - HotSpot的发展历程 2 JVM的组成3 字节码文件的打开方式3.1 以正确的姿势打开字节码.class文件3.1.1 NotePad的插件HexEditor3.1.2 jclasslib3.1.3 IDEA插件jclasslib 4 字节码文件的…

蓝桥杯备赛 day 2 —— 二分算法(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 二分的概念 &#x1f4c1; 整数二分 &#x1f4c1; 二分的模板 &#x1f4c1; 习题 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文章主要是准备蓝桥杯竞赛同学所写&#xff0c;为你更好准备蓝桥杯比赛涉及…

OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

MS2358——96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

高密数据中心卓越运维,更灵活助力企业 AI 就绪

AIGC的高速发展将企业对基础架构的需求推上了新的层次&#xff0c;根据中国通服数字基建产业研究院发布的《中国数据中心产业发展白皮书&#xff08;2023&#xff09;》报告&#xff0c;互联网行业客户对单机柜功率密度的要求较高&#xff0c;一般在6-8kW&#xff0c;金融行业处…

使用vscode编写golang代码并交叉编译生成

文章目录 一、修改Go相关环境变量二、为vscode安装插件及依赖1、安装插件2、安装相关依赖 三、新建项目并编写代码1、打开文件夹后&#xff0c;初始化mod&#xff0c;在终端执行&#xff1a;2、新建main.go编写代码 四、运行、调试、build代码1、运行2、调试3、生成可执行文件4…

从js闭包谈到作用域、作用域链、执行上下文、内存管理

文章目录 作用域函数作用域和全局作用域块级作用域和暂时性死区执行上下文和调用栈代码执行的两个阶段调用栈闭包内存管理内存泄漏场景举例浏览器垃圾回收如何避免内存泄漏如何利用闭包实现单例模式 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄…

Spring Boot 单体应用升级 Spring Cloud 微服务

作者&#xff1a;刘军 Spring Cloud 是在 Spring Boot 之上构建的一套微服务生态体系&#xff0c;包括服务发现、配置中心、限流降级、分布式事务、异步消息等&#xff0c;因此通过增加依赖、注解等简单的四步即可完成 Spring Boot 应用到 Spring Cloud 升级。 *Spring Cloud …

喜报!博睿数据荣获数据猿“年度创新服务企业奖、年度创新服务产品奖”!

1月17日&#xff0c;由数据猿与上海大数据联盟联合主办的“大数据产业发展论坛”活动在上海隆重举办。其中&#xff0c;备受关注的《2023中国大数据产业年度榜单》正式揭晓。在众多优秀的企业中&#xff0c;博睿数据凭借其前瞻性的产品技术布局、强大的市场影响力以及卓越的智能…

将vue项目打包成桌面客户端实现点击桌面图标直接进入项目

1.下载NW.js 下载地址&#xff1a;NW.js官网 下载完后zip解压 2.文件夹下新建index.html index内容如下&#xff1a; <!DOCTYPE html> <html> <head> </head> <body> <script language"javascript" type"text/javascript&q…

在分类任务中准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,如何在python中使用呢?

在机器学习和数据科学中&#xff0c;准确率&#xff08;accuracy&#xff09;、精确率&#xff08;precision&#xff09;、召回率&#xff08;recall&#xff09;和 F1 分数是常用的性能指标&#xff0c;用于评估分类模型的性能。 1. 准确率&#xff08;Accuracy&#xff09;…

【软件测试常见Bug清单】

软件测试中&#xff0c;bug的类型有很多种&#xff0c;比如&#xff1a;代码错误、界面优化、设计缺陷、需求补充和用户体验等&#xff1b; 一般情况下&#xff0c;需求补充和设计缺陷比较好区分&#xff0c;但是代码错误、界面优化和用户体验区分不是很明显&#xff1b; 下面…

C语言经典练习3——[NOIP2008]ISBN号码与圣诞树

前言 在学习C语言的过程中刷题是很重要的&#xff0c;俗话说眼看千遍不如手动一遍因为在真正动手去刷题的时候会暴露出更多你没有意识到的问题接下来我就为各位奉上两道我认为比较有代表性的题 1. [NOIP2008]ISBN号码 1.1 题目描述 每一本正式出版的图书都有一个ISBN号码与之对…

MySQL运维篇(四)读写分离

一、介绍 读写分离&#xff0c;简单地说是把对数据库的读和写操作分开&#xff0c;以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力。 通过 MyCat 即可轻易实现上述功能&#xff0c;不仅可以支持 My…

搜索与图论第三期 树与图的深度优先遍历

前言 该部分内容实际上是DFS的一个扩展&#xff0c;只要是会了DFS之后&#xff0c;这部分其实也差不多&#xff0c;直接上例题啦就。 1…

STM32F103标准外设库——SysTick系统定时器(八)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…