介绍 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: Ripemd160hash1: Ripemd160
}export class BitVM extends SmartContract {@prop()hashPairA: HashPair@prop()hashPairB: HashPair@prop()hashPairE: HashPairconstructor(hashPairA: HashPair, hashPairB: HashPair, hashPairE: HashPair) {super(...arguments)this.hashPairA = hashPairAthis.hashPairB = hashPairBthis.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.mzph.cn/news/631937.shtml

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

相关文章

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DQN、Double DQN、Dueling DQN、Per DQN、NoisyDQN 学习笔记

文章目录 DQN (Deep Q-Network)说明伪代码应用范围 Double DQN说明伪代码应用范围 Dueling DQN实现原理应用范围伪代码 Per DQN (Prioritized Experience Replay DQN)应用范围伪代码 NoisyDQN伪代码应用范围 部分内容与图片摘自&#xff1a;JoyRL 、 EasyRL DQN (Deep Q-Networ…

RAM读写测试

真双口RAM读写测试 IP核设置如下 注意点是&#xff1a; 1、wea信号位宽由于选择了32bit地址&#xff0c;导致使能了按字节写入&#xff0c;因此wea每一位对应一个8bit的din&#xff0c;高有效&#xff1b; 2、rsta 信号指RAM复位置位信号&#xff0c;高有效&#xff0c;但是…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

【GAMES101】Lecture 07 着色(shading)

目录 着色 Blinn-Phong反射模型 漫反射 光衰减 着色 这个着色&#xff08;shading&#xff09;就是将不同的材质应用到不同的物体上&#xff0c;像一个物体&#xff0c;它可以是木头的、金属的、塑料的…… Blinn-Phong反射模型 我们来看一个简单的着色模型&#xff0c;…

冻结Prompt微调LM: PET(b) LM-BFF

PET-TC(B) paper b: 2020.9 It’s not just size that matters: Small language models are also few-shot learners. Prompt&#xff1a; 多字完形填空式人工Prompt Task&#xff1a;Text Classification Model: Albert-xxlarge-v2 Take Away: 支持多字的完形填空Prompt&a…

基于DQN和TensorFlow的LunarLander实现(全代码)

使用深度Q网络&#xff08;Deep Q-Network, DQN&#xff09;来训练一个在openai-gym的LunarLander-v2环境中的强化学习agent&#xff0c;让小火箭成功着陆。 下面代码直接扔到jupyter notebook或CoLab上就能跑起来。 目录 安装和导入所需的库和环境Q网络搭建经验回放实现DQNAge…

【算法Hot100系列】字母异位词分组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

环境变量配置文件

1.配置文件简介 source命令 source命令通常用于保留、更改当前shell中的环境变量。 格式&#xff1a; source 配置文件 . 配置文件 环境变量配置文件简介 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量&#xff0c;比如PATH、HISTSI…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

Ikuai中如何添加/更换虚拟机(图文)

Ikuai配置 分区/格式化硬盘(如果已经格式化&#xff0c;无需再次格式化&#xff0c;直接传送到上传镜像) 上传镜像 ⚠️&#xff1a;如果是压缩格式&#xff0c;需要解压缩后上传&#xff0c;如这里的IMG格式。 创建虚拟机 配置虚拟机&#xff08;等待虚拟机起来后执行&#…

Vulnhub-w1r3s-editable

一、信息收集 端口扫描&#xff0c;ftp允许匿名登录&#xff0c;但是没有得到什么有用的线索 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-syst: | STAT: | FTP server status: | Connected to ::ffff:192.168.1.6 | …

FeatInsight: 基于 OpenMLDB 的特征平台助力高效的特征管理和编排

OpenMLDB 社区新开源了特征平台产品 - FeatInsight&#xff08;https://github.com/4paradigm/FeatInsight&#xff09;&#xff0c;是一个先进的特征存储(Feature Store)服务&#xff0c;基于 OpenMLDB 数据库实现高效的特征管理和编排功能。FeatInsight 特征平台提供简便易用…

JeecgBoot集成东方通TongRDS

TongRDS介绍 TongRDS&#xff08;简称 RDS&#xff09;是分布式内存数据缓存中间件&#xff0c;用于高性能内存数据共享与应用支持。RDS为各类应用提供高效、稳定、安全的内存数据处理能力&#xff1b;同时它支持共享内存的搭建弹性伸缩管理&#xff1b;使业务应用无需考虑各种…

Active Directory监控工具

Active Directory 是 Microsoft 为 Windows 环境实现的 LDAP 目录服务&#xff0c;它允许管理员对用户访问资源和服务实施公司范围的策略。Active Directory 通常安装在 Windows 2003 或 2000 服务器中&#xff0c;它们统称为域控制器。如果 Active Directory 出现故障&#xf…

跑通 yolov5-7.0 项目之训练自己的数据集

yolov5 一、yolov5 源码下载二、配置环境&#xff0c;跑通项目三、训练自己的数据集1、获取验证码数据2、标注图片&#xff0c;准备数据集3、开始训练自己的数据集1、train.py 训练数据集2、val.py 验证测试你的模型3、detect.py 正式用你的模型 四、遇到的报错、踩坑1、import…

电脑内存满了怎么清理内存?试试这6个方法~

内存越大&#xff0c;运行越快&#xff0c;程序之间的切换和响应也会更加流畅。但是随着时间的增加&#xff0c;还是堆积了越来越多的各种文件&#xff0c;导致内存不够用&#xff0c;下面就像大家介绍三种好用的清理内存的方法。 方法一&#xff1a;通过电脑系统自带的性能清理…

vim 编辑器如何同时注释多行以及将多行进行空格

当然可以&#xff0c;以下是我对您的文字进行润色后的版本&#xff1a; 一、场景 YAML文件对空格的要求非常严格&#xff0c;因此在修改YAML时&#xff0c;我们可能需要批量添加空格。 二、操作步骤 请注意&#xff1a;您的所有操作都将以第一行为基准。也就是说&#xff0…

OpenCV-Python(39):Meanshift和Camshift算法

目标 学习了解Meanshift 和Camshift 算法在视频中找到并跟踪目标 Meanshift 原理 Meanshift算法是一种基于密度的聚类算法&#xff0c;用于将数据点划分为不同的类别。它的原理是通过数据点的密度分布来确定聚类中心&#xff0c;然后将数据点移动到离其最近的聚类中心&#…

【代码随想录07】344.反转字符串 541. 反转字符串II 05.替换空格 151.翻转字符串里的单词 55. 右旋转字符串

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 05. 替换数字题目描述参考代码 151. 反转字符串中的单词题目描述参考代码 55. 右旋转字符串题目描述参考代码 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反…