地勘网站建设方案,高级经济师,福建省建设人才与科技发展中心网站,知名的深圳小程序开发公司将序数与比特币智能合约集成#xff1a;第 1 部分
最近#xff0c;比特币序数在区块链领域引起了广泛关注。 据称#xff0c;与以太坊 ERC-721 等其他代币标准相比#xff0c;Ordinals 的一个主要缺点是缺乏对智能合约的支持。
我们展示了如何向 Ordinals 添加智能合约功…将序数与比特币智能合约集成第 1 部分
最近比特币序数在区块链领域引起了广泛关注。 据称与以太坊 ERC-721 等其他代币标准相比Ordinals 的一个主要缺点是缺乏对智能合约的支持。
我们展示了如何向 Ordinals 添加智能合约功能从而扩大其用例范围。 与普遍看法相反序数不仅与智能合约兼容而且实际上非常适合智能合约。 作为展示我们开发了一个支持许可序数的智能合约。 与常规/无需许可的序数相比每次转让都需要由发行人批准和共同签署。
基本思想
比特币采用UTXOUnspent Transaction Output模型。每个UTXO由两个字段组成
value此输出中的聪数量script锁定输出的比特币脚本。
如果使用 1Sat Ordinals 将 UTXO 记录为不可替代代币 (NFT)则该value 为 1并且 script 控制如何铸造或转移代币。 由于聪和脚本位于两个正交字段中因此序数代币可以锁定到任何脚本中。 这意味着代币可以由任何智能合约控制。
铸造(Mint)
正如我们之前介绍的序数被刻在操作码 OP_FALSE OP_IF 和 OP_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 scriptprop()readonly inscriptLen: bigintprop(true)owner: PubKey// is being mintedprop(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官方账号