将 ordinals 与 比特币智能合约集成 : 第 1 部分
将序数与比特币智能合约集成:第 1 部分
最近,比特币序数在区块链领域引起了广泛关注。 据称,与以太坊 ERC-721 等其他代币标准相比,Ordinals 的一个主要缺点是缺乏对智能合约的支持。
我们展示了如何向 Ordinals 添加智能合约功能,从而扩大其用例范围。 与普遍看法相反,序数不仅与智能合约兼容,而且实际上非常适合智能合约。
作为展示,我们开发了一个支持许可序数的智能合约。 与常规/无需许可的序数相比,每次转让都需要由发行人批准和共同签署。
基本思想
比特币采用UTXO(Unspent Transaction Output)模型。每个UTXO由两个字段组成:
- value:此输出中的聪数量
- script:锁定输出的比特币脚本。
如果使用 1Sat Ordinals 将 UTXO 记录为不可替代代币 (NFT),则该value
为 1,并且 script
控制如何铸造或转移代币。 由于聪和脚本位于两个正交字段中,因此序数代币可以锁定到任何脚本中。 这意味着代币可以由任何智能合约控制。
铸造(Mint)
正如我们之前介绍的,序数被刻在操作码 OP_FALSE OP_IF
和 OP_ENDIF
之间的“信封”中。
OP_FALSE
确保铭文脚本永远不会进入 OP_IF
分支并且永远不会被执行。 整个铭文脚本可以被视为一个 NOP
,并与其他脚本结合在一起,而不改变后者的执行。
对于 sCrypt,它被添加到从 sCrypt 智能合约编译的锁定脚本之前。 它不会改变合约的行为,因此可以安全地与任何合约结合。
<Inscription Script> <Locking Script>
转移(Transfer)
代币铸造后,其转移由智能合约决定,就像原生比特币一样。 每次转账都可以将代币/聪转移到新的智能合约中。 注意,确保转移时没有前面的铭文,只有在第一次铭文时才会有。
<Locking Script>
许可序数
如今,大多数序数都使用 Pay To Pubkey Hash (P2PKH) 作为锁定脚本。 当 Alice 想要将序数转移给 Bob 时,她不需要任何第三方的许可。
在某些情况下,每次转让都必须得到发行人的批准,例如为了遵守法律。 当铸造这样的序数时,我们可以使用以下智能合约。
export class PermissionedOrdinal extends SmartContract {@prop()readonly issuer: PubKey// length of inscription script@prop()readonly inscriptLen: bigint@prop(true)owner: PubKey// is being minted@prop(true)isMint: booleanconstructor(issuer: PubKey, inscriptLen: bigint) {super(...arguments)this.issuer = issuerthis.inscriptLen = inscriptLenthis.owner = issuerthis.isMint = true}@method()public transfer(recipient: PubKey, ownerSig: Sig, issuerSig: Sig) {assert(this.checkSig(ownerSig, this.owner), 'owner signature check failed')// issuer co-signassert(this.checkSig(issuerSig, this.issuer), 'issuer signature check failed')// save a local copyconst isMint = this.isMintthis.owner = recipientthis.isMint = falselet stateScript = this.getStateScript()if (isMint) {// Cut leading inscription script.stateScript = slice(stateScript, this.inscriptLen)}// Propagate contract to next output and ensure the value stays 1 sat.let outputs = Utils.buildOutput(stateScript, 1n)outputs += this.buildChangeOutput()assert(this.ctx.hashOutputs == hash256(outputs), 'hashOutputs mismatch')}
}
PermissionedOrdinal 合约
除了第 26
行当前所有者的签名(第 10
行是合同状态)之外,第 28
行还需要发行人的签名。
由于合约是有状态的,因此每次转让都必须确保聪被转移到同一个合约中,确保所有后续转让都需要发行人签名,而不仅仅是铸币后的第一次转让。 请注意,主要铭文脚本在第 38
行的第一次传输时被剪切。
其他潜在用例
Ordinal 代币和智能合约的正交性意味着它们是无限可组合的。 有多种方法可以将它们结合起来。 下面我们只列出几个例子:
- 序数锁:锁定一个序数 utxo,任何人都可以通过购买来解锁该序数 utxo,或者由列出者取消。
- OP-NS:使用迷你工作量证明支持的 Ordinals Inscriptions 为比特币数据空间创建一个 fair-mint 分层命名系统
- 序数和比特币之间的原子交换:将序数锁定在 HLTC 中以允许无需信任的序数销售
- 供应上限:目前,BSV-20² 允许铸造的代币数量超过部署中的最大供应量。 使用合约,我们可以禁止链上的此类铸造交易,而不是事后在索引器上使它们在链下无效
- 黑名单/白名单
- 冻结与恢复
[1] 事实上,当 sCrypt 智能合约是无状态时,铭文脚本可以插入到任何地方。 例如,它可以附加到合同脚本中。 但追加不适用于有状态合约。 为了使其能够与任何 sCrypt 合约一起使用,我们在一开始就将其作为约定。
[2] 基于 1Sat Ordinals 的可替代代币标准。
即刻关注sCrypt官方账号,获取更多资讯:马上关注!sCrypt官方账号
相关文章:

将 ordinals 与 比特币智能合约集成 : 第 1 部分
将序数与比特币智能合约集成:第 1 部分 最近,比特币序数在区块链领域引起了广泛关注。 据称,与以太坊 ERC-721 等其他代币标准相比,Ordinals 的一个主要缺点是缺乏对智能合约的支持。 我们展示了如何向 Ordinals 添加智能合约功…...

【USRP】集成化仪器系列1 :信号源,基于labview实现
USRP 信号源 1、设备IP地址:默认为192.168.10.2,请勿 修改,运行阶段无法修改。 2、天线输出端口是TX1,请勿修改。 3、通道:0 对应RF A、1 对应 RF B,运行 阶段无法修改。 4、中心频率:当需要…...

串行协议——USB驱动[基础]
多年前的学习记录,整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…...

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评
健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评 2022年全国儿童青少年总体近视率为53.6%,其中6岁儿童为14.5%,小学生为36%,初中生为71.6%,高中生为81%,近视已成为当下人们遇到的比较普遍的眼健康问题…...

PID 算法
1.1 概述 比例(Proportion)积分(Integral)微分(Differential)控制器(PID控制器或三项控制器)是一种采用反馈的控制回路机制,广泛应用于工业控制系统和需要连续调制控制的…...

13.Redis 事务
Redis 事务 redis 事务事务操作multi 开启事务exec 执行事务discard 放弃当前事务watchunwatch redis 事务 Redis 的事务和 MySQL 的事务概念上是类似的。 都是把⼀系列操作绑定成⼀组。 让这⼀组能够批量执⾏。 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: 这里指的是 …...
李宏毅机器学习课程笔记(更新ing)
CNN 为什么AlphaGo可以用CNN?棋盘抽象成图片时需要注意什么? 首先图片有两个特点: 1,只观察局部就可以显示某种pattern,比如要得出一个鸟嘴的结论,只需要观察局部图片 2,某种pattern可以出现在图…...

SIP mini 对讲终端,带sip热点功能
SV-A10/SV-A10W SIP mini 对讲终端,带sip热点功能 SV-A10/SV-A10W 是专门针对行业用户需求研发的一款 SIP mini 对讲产品,外观小巧,功能 强大,集智能安防、音/视频对讲和广播功能于一体,性价比高。支持壁挂式安装/86…...
PHP中根据出生年月日计算年龄的封装函数
在 PHP 中,你可以使用以下函数来根据出生年月日计算年龄: 封装函数 function calculateAge($birthday) {$currentDate date(Y-m-d);$birthdayDate date(Y-m-d, strtotime($birthday));$age date_diff(date_create($currentDate), date_create($birt…...
Linux巡检脚本
做运维的朋友都知道,大家经常要对一些系统做月度维护或者自查,在这个过程中,如果只是小工作量的查询,进入系统直接输入命令即可。但是如果说要查询的系统很多,每个系统中要查询的项目也很多,那么每次都要一…...
SQLite 3.43.0 发布,又有啥新功能?
SQLite 开发团队于 2023 年 08 月 24 日发布了 SQLite 3.43.0 版本。本文给大家分析一下该版本的更新。 全文索引 SQLite 3.43.0 增加了 Contentless-Delete FTS5 索引。这是一种 FTS5 全文索引的变种,不存储被索引的内容,同时支持数据的删除操作。 例…...

百度自研高性能ANN检索引擎,开源了
作者 | Puck项目组 导读 Puck是百度自研的开源ANN检索引擎。Puck开源项目包含两种百度自研的检索算法,以高召回、高准确、高吞吐为目标,适用于多种数据规模和场景。随着业务发展不断的优化和迭代,进行充分的技术开发和测试,确保了…...
golang遍历map的方法
在Go语言中,可以使用range关键字来遍历一个map。range关键字会返回两个值:key和value。 以下是遍历map的示例代码: package main import "fmt" func main() { myMap : map[string]int{ "apple": 1, "banana…...

如何让Android平台像网络摄像机一样实现GB28181前端设备接入?
技术背景 好多开发者在做国标对接的时候,首先想到的是IPC(网络摄像头),通过参数化配置,接入到国标平台,实现媒体数据的按需查看等操作。 像执法记录仪等智能终端,跑在Android平台,…...
文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rus…...

SpringMVC入门篇
目录 1.SpringMVC工作流程 2.SpringMVC核心组件 2.1 DispatcherServlet 2.2 HandlerMapping 2.3 Handler 2.4 HandlerAdapter 2.5 ViewResolver 2.6 View 3.SpringMVC的入门 3.1 添加相关依赖 3.2 创建Spring-mvc.xml 3.3 配置web.xml 3.4 效果演示 4.静态资源处…...

面经:安卓学习笔记
文章目录 1. Android系统架构2. Activity2.0 定义2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5…...

Java设计模式:四、行为型模式-06:观察者模式
文章目录 一、定义:观察者模式二、模拟场景:观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案:观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…...

vscode中讨厌的蓝色波浪线的去除小trick和原理
问题描述 不小心“设置同步”时和远程电脑的合并(merge)了,然后就出现了这个问题!烦死了!!! 大概是这个样子: 解决办法 站在了巨人的肩膀上,在下图位置输入这样一行参数&…...

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿
近期换了工作电脑,公司的IT团队不够给力,不能复制电脑系统,所以又到了需要重装IDE配置开发环境的时候了;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题,这里整理下解决方法以备不时之需; …...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...