将 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_IFOP_ENDIF 之间的“信封”中。

文本铭文“Hello, world!”

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: boolean

    constructor(issuer: PubKey, inscriptLen: bigint) {
        super(...arguments)
        this.issuer = issuer
        this.inscriptLen = inscriptLen
        this.owner = issuer
        this.isMint = true
    }

    @method()
    public transfer(recipient: PubKey, ownerSig: Sig, issuerSig: Sig) {
        assert(this.checkSig(ownerSig, this.owner), 'owner signature check failed')
        // issuer co-sign
        assert(this.checkSig(issuerSig, this.issuer), 'issuer signature check failed')
        
        // save a local copy
        const isMint = this.isMint

        this.owner = recipient
        this.isMint = false
        let 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 代币和智能合约的正交性意味着它们是无限可组合的。 有多种方法可以将它们结合起来。 下面我们只列出几个例子:

  1. 序数锁:锁定一个序数 utxo,任何人都可以通过购买来解锁该序数 utxo,或者由列出者取消。
  2. OP-NS:使用迷你工作量证明支持的 Ordinals Inscriptions 为比特币数据空间创建一个 fair-mint 分层命名系统
  3. 序数和比特币之间的原子交换:将序数锁定在 HLTC 中以允许无需信任的序数销售
  4. 供应上限:目前,BSV-20² 允许铸造的代币数量超过部署中的最大供应量。 使用合约,我们可以禁止链上的此类铸造交易,而不是事后在索引器上使它们在链下无效
  5. 黑名单/白名单
  6. 冻结与恢复

[1] 事实上,当 sCrypt 智能合约是无状态时,铭文脚本可以插入到任何地方。 例如,它可以附加到合同脚本中。 但追加不适用于有状态合约。 为了使其能够与任何 sCrypt 合约一起使用,我们在一开始就将其作为约定。

[2] 基于 1Sat Ordinals 的可替代代币标准。


即刻关注sCrypt官方账号,获取更多资讯:马上关注!sCrypt官方账号

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Qt中安装OpenSSL,你可以使用以下代码来查看当前版本的Qt所依赖的OpenSSL版本: qDebug() << QSslSocket::sslLibraryBuildVersionString(); 另外,你也可以查看OpenSSL git仓库的日志,找到分支OpenSSL-1_1_0-stable,在相关的提交记录中查看版本对应的描述。例如,在以下提交中有对应的描述: SHA-1: 6928b6171ada6d0de5a024a188dc7a68094d2dca Change names of ordinals and libs, libeay => libcrypto and ssleay => libssl Reviewed-by: Rich Salz <rsalz@openssl.org> 为了确保输出的信息正确,你还可以在网上进行在线验证。此外,你还可以参考一些教程或指南,如Windows下编译OpenSSL、OpenSSL How to Include OpenSSL in a Qt project以及Building OpenSSL for Visual Studio等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Qt中使用OpenSSL](https://blog.csdn.net/u012790503/article/details/120977616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Qt之OpenSSL](https://blog.csdn.net/weixin_33946020/article/details/90524886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sCrypt Web3应用开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值