在近期Arc-20协议出现后又使铭文市场大火了一把,本文将从技术角度出发深入两个协议的细节以及优劣势。
比特币最初被设计为一种安全、稳定且可靠的去中心化数字货币。然而,由于其技术架构和脚本语言相对不如以太坊灵活,因此比特币并不适合直接运行智能合约。
尽管如此,开发者的创新思想和大胆尝试为比特币生态带来了繁荣,其中一个典型例子就是Brc-20协议。该协议核心思想是实验性的代币形式,以meme为中心。任何人都可以根据先到先得的原则,在比特币链上直接铸造这些代币,而无需依赖智能合约。Brc-20代币的关键特征是其分散化性质,摒弃了私人发售、预售以及解锁或质押等机制。这确保了参与的真正去中心话。
在这一背景下,Arc-20协议再次引发了对铭文的浓厚兴趣。
Brc-20协议和Arc-20协议都基于Btc链,因此在正式介绍Arc-20协议和Brc-20协议之前,我们需要简单的认识一下UTXO(unspent transaction output)
当我们谈论比特币时,UTXO(未花费的交易输出)模型是一种重要的设计概念。它是比特币使用的一种账户模型,与传统的账户余额模型(如银行账户)有所不同。
在UTXO模型中,每个比特币交易都创建了一系列未花费的输出,每个输出代表了一定数量的比特币。这些未花费的输出实际上是未使用的数字货币单位,类似于纸币或硬币。当你收到比特币时,实际上是有人创建了一个新的未花费的输出,该输出与你的比特币地址相关联。这个输出就是UTXO。
让我们用一个简单的例子来解释UTXO模型:
如果你有两笔交易,一笔收到了0.7 BTC,另一笔收到了0.5 BTC,你将拥有两个 UTXO,一个价值0.7 BTC,一个价值0.5 BTC。当你想要支付1 BTC 时,你不能简单地使用一个 UTXO,而是需要将两个 UTXO 合并为一个新的 UTXO(总额为1.2 BTC),然后将1 BTC 发送给收款方,剩余的0.2 BTC 作为找零返回给你自己。但找零实际情况可能会低于0.2BTC,因为用户需要给矿工一笔手续费以确保交易的正常运行。
BRC-20是一个实验性标准,演示了通过利用序数理论和铭文,在比特币的第一层(layer 1)上创建可互换代币的可能性。Ordinals协议(第一个按照该协议标准所铸造的代币)允许内容,包括文本、图像或视频,被铭记在比特币最小单位 — — 聪(Satoshi)上,从而创造出独特的数字资产。
序数理论是在BTC网络上实现铭文的关键。
每个聪本质上是一样的,Ordinals通过叙述理论制定了一套聪的排序协议,这个排序基于聪的挖出和他们交易输入和输出的顺序
序数有几种不同的表示方法:
度数表达法中包含四个部分:A°B′C″D‴,并且A,B,C,D代表着不同的含义:
叙述理论通过度数表达法来确定一个聪的顺序,并且通过顺序来给每个聪定义不同的稀有程度,从而实现每个聪的独一无二
举例说明,比如现有一个度数表达为 1°1′0″0‴ ,其中
通过上面的稀有度定义,这个聪被定义为罕见的聪。
大致的流程如下所致:
py# 计算给定高度的块的叙述(奖励)
def subsidy(height):
return 50 * 100_000_000 >> height // 210_000
这个函数用于计算给定高度的比特币块的奖励,其中 50 * 100_000_000 是比特币的起始奖励,>> 是右移位运算符,相当于除以 2 的整数除法。这个函数返回一个整数,表示在给定高度的块的奖励数量。
def first_ordinal(height):
start = 0
for h in range(height):
start += subsidy(h)
return start
这个函数计算在给定高度的块的第一个奖励的序数。通过迭代高度并累加每个块的奖励,计算从第一个块到给定高度的总奖励数量,从而得到第一个奖励的序数。
def assign_ordinals(block):
first = first_ordinal(block.height)
last = first + subsidy(block.height)
coinbase_ordinals = list(range(first, last))
def assign_ordinals(block):
first = first_ordinal(block.height)
last = first + subsidy(block.height)
coinbase_ordinals = list(range(first, last))
for transaction in block.transactions[1:]:
ordinals = []
for input in transaction.inputs:
ordinals.extend(input.ordinals)
for output in transaction.outputs:
output.ordinals = ordinals[:output.value]
del ordinals[:output.value]
coinbase_ordinals.extend(ordinals)
for output in block.transactions[0].outputs:
output.ordinals = coinbase_ordinals[:output.value]
del coinbase_ordinals[:output.value]
这个函数用于为给定的比特币块分配序数。它首先计算块的第一个和最后一个奖励的序数范围。接下来,它迭代块中的每个交易,为每个输出分配序数。最后,为交易的输出分配序数,以确保整个块中的所有聪都有唯一的序数。
简而言之,通过序数理论,oridinals将本质上每个相同的聪(Satoshi) 通过加工变得独一无二起来,并且通过规则为每一个聪定义稀有熟悉, 实现收藏属性或者适制定玩法的规则。
Atomicals 协议是一个简单而灵活的协议,用于在未花费的交易输出(UTXO)区块链(如比特币)上铸造、转移和更新数字对象(传统上称为非同质化代币)。一个 Atomical(或称为 “atom”) 是一种管理数字对象的创建、转移和更新的方式 — — 本质上是根据一些简单规则定义的数字所有权链。
Arc-20采用了染色币模型,也就是说一个Arc-20 token都必须有一个聪支持,而非像Brc-20通过排序进行区分。由于Arc-20 代币完全基于聪,使得他可以像Btc一样进行拆分和合并(也就是文章开头提及的UTXO),并且可以直接通过比特币网络进行转帐。
举例说明,通过Atomicals 协议,我们将指定的100个聪定义为100张“电影票”,用户可以在支持Atomicals协议的电影院,拿这100个聪中的一个来支付,充当电影票的职能
但是矿工和比特币网络并不能知道哪个UTXO经过了”Atomicals”化,从而可能误把Arc-20代币当成矿工费用,为了解决这一问题,Artomicals通过指令操作,将每一个Arc-20代币都作为交易的第一个输出来避免代币的误销毁。
接下来,我们将分析比较两个协议的异同。
协议大致分为三步
{
“p”: “brc-20”,
“op”: “deploy”,
“tick”: “ordi”,
“max”: “21000000”,
“lim”: “1000”
}
由于部署者在部署代币时,代币信息本身无法被BTC所识别,因此需要一个索引器(indexer)来获取链上相关数据并通过该数据在链下创建一个账本来记录相关历史以及处理相关操作并进行数据更新。
链下索引器需要精准的捕获每次一代币操作并更新线下账本。但同区块链一样,随着交易的增多,节点存储的数据将会越来越大,如何保证账本的完整性以及在庞大的数据量中找到需要更改的信息,将会成为brc-20的挑战
同样的,Arc-20协议在部署代币时也需要在BTC链上根据格式记录相关信息
program.command(‘init-dft’)
.description(‘Initialize fungible token (FT) atomical in decentralized issuance mode’)
.argument(‘<ticker>’, ‘string’)
.argument(‘<mint_amount>’, ‘number’)
.argument(‘<max_mints>’, ‘number’)
.argument(‘<mint_height>’, ‘number’)
.argument(‘<file>’, ‘string’)
.option(‘—rbf’, ‘Whether to enable RBF for transactions.’)
.option(‘—funding <string>’, ‘Use wallet alias wif key to be used for funding and change’)
.option(‘—satsbyte <number>’, ‘Satoshis per byte in fees’, ‘15’)
.option(‘—mintbitworkc <string>’, ‘Whether to require any bitwork proof of work to mint. Applies to the commit transaction.’)
.option(‘—mintbitworkr <string>’, ‘Whether to require any bitwork proof of work to mint. Applies to the reveal transaction.’)
.option(‘—bitworkc <string>’, ‘Whether to put any bitwork proof of work into the token mint. Applies to the commit transaction.’)
.option(‘—bitworkr <string>’, ‘Whether to put any bitwork proof of work into the token mint. Applies to the reveal transaction.’)
.option(‘—parent <string>’, ‘Whether to require a parent atomical to be spent along with the mint.’)
.option(‘—parentowner <string>’, ‘Wallet owner of the parent to spend along with the mint.’)
.option(‘—disablechalk’, ‘Whether to disable the real-time chalked logging of each hash for Bitwork mining. Improvements mining performance to set this flag’)
.action(async (ticker, mintAmount, maxMints, mintHeight, file, options) => {
…..
}
在atomicals-js cli源码中可以找到初始化一个代币的相关指令,必须要在链上记录的参数有:
ticker: 代币名称
mint_amount: mint总量
max_mints: 单次mint数量
mint_height: 指定开始mint的区块高度
file: 相关元数据
但与Brc20不同的是, Arc20采用了染色币模型,在代币相关信息录入BTC链上后,该协议将会把代币与Sats做锚定:1 token = 1 sat。
同时,染色币模型的使用使得用户在进行交易时可以直接通过BTC网络实现而非链下账本,因为代币余额与UTXO中的聪保持一致,代币的相关变化都可以在链上直观的反映。索引器在Arc-20中只是用来读取代币在链上的相关部署信息,并且验证哪些是符合Arc-20协议的代币。
Brc-20的设计结构更依赖与链下账本,而Arc-20更符合Btc的相关特性,并且相较于Brc-20会更去中心化。但同时,染色币模型使得Arc-20无法完成meme币的发售,因为meme币往往有很高的代币总数,而1 token = 1 sat这一特性使得在发售meme币时需要消耗大量Btc
在近期Arc-20协议出现后又使铭文市场大火了一把,本文将从技术角度出发深入两个协议的细节以及优劣势。
比特币最初被设计为一种安全、稳定且可靠的去中心化数字货币。然而,由于其技术架构和脚本语言相对不如以太坊灵活,因此比特币并不适合直接运行智能合约。
尽管如此,开发者的创新思想和大胆尝试为比特币生态带来了繁荣,其中一个典型例子就是Brc-20协议。该协议核心思想是实验性的代币形式,以meme为中心。任何人都可以根据先到先得的原则,在比特币链上直接铸造这些代币,而无需依赖智能合约。Brc-20代币的关键特征是其分散化性质,摒弃了私人发售、预售以及解锁或质押等机制。这确保了参与的真正去中心话。
在这一背景下,Arc-20协议再次引发了对铭文的浓厚兴趣。
Brc-20协议和Arc-20协议都基于Btc链,因此在正式介绍Arc-20协议和Brc-20协议之前,我们需要简单的认识一下UTXO(unspent transaction output)
当我们谈论比特币时,UTXO(未花费的交易输出)模型是一种重要的设计概念。它是比特币使用的一种账户模型,与传统的账户余额模型(如银行账户)有所不同。
在UTXO模型中,每个比特币交易都创建了一系列未花费的输出,每个输出代表了一定数量的比特币。这些未花费的输出实际上是未使用的数字货币单位,类似于纸币或硬币。当你收到比特币时,实际上是有人创建了一个新的未花费的输出,该输出与你的比特币地址相关联。这个输出就是UTXO。
让我们用一个简单的例子来解释UTXO模型:
如果你有两笔交易,一笔收到了0.7 BTC,另一笔收到了0.5 BTC,你将拥有两个 UTXO,一个价值0.7 BTC,一个价值0.5 BTC。当你想要支付1 BTC 时,你不能简单地使用一个 UTXO,而是需要将两个 UTXO 合并为一个新的 UTXO(总额为1.2 BTC),然后将1 BTC 发送给收款方,剩余的0.2 BTC 作为找零返回给你自己。但找零实际情况可能会低于0.2BTC,因为用户需要给矿工一笔手续费以确保交易的正常运行。
BRC-20是一个实验性标准,演示了通过利用序数理论和铭文,在比特币的第一层(layer 1)上创建可互换代币的可能性。Ordinals协议(第一个按照该协议标准所铸造的代币)允许内容,包括文本、图像或视频,被铭记在比特币最小单位 — — 聪(Satoshi)上,从而创造出独特的数字资产。
序数理论是在BTC网络上实现铭文的关键。
每个聪本质上是一样的,Ordinals通过叙述理论制定了一套聪的排序协议,这个排序基于聪的挖出和他们交易输入和输出的顺序
序数有几种不同的表示方法:
度数表达法中包含四个部分:A°B′C″D‴,并且A,B,C,D代表着不同的含义:
叙述理论通过度数表达法来确定一个聪的顺序,并且通过顺序来给每个聪定义不同的稀有程度,从而实现每个聪的独一无二
举例说明,比如现有一个度数表达为 1°1′0″0‴ ,其中
通过上面的稀有度定义,这个聪被定义为罕见的聪。
大致的流程如下所致:
py# 计算给定高度的块的叙述(奖励)
def subsidy(height):
return 50 * 100_000_000 >> height // 210_000
这个函数用于计算给定高度的比特币块的奖励,其中 50 * 100_000_000 是比特币的起始奖励,>> 是右移位运算符,相当于除以 2 的整数除法。这个函数返回一个整数,表示在给定高度的块的奖励数量。
def first_ordinal(height):
start = 0
for h in range(height):
start += subsidy(h)
return start
这个函数计算在给定高度的块的第一个奖励的序数。通过迭代高度并累加每个块的奖励,计算从第一个块到给定高度的总奖励数量,从而得到第一个奖励的序数。
def assign_ordinals(block):
first = first_ordinal(block.height)
last = first + subsidy(block.height)
coinbase_ordinals = list(range(first, last))
def assign_ordinals(block):
first = first_ordinal(block.height)
last = first + subsidy(block.height)
coinbase_ordinals = list(range(first, last))
for transaction in block.transactions[1:]:
ordinals = []
for input in transaction.inputs:
ordinals.extend(input.ordinals)
for output in transaction.outputs:
output.ordinals = ordinals[:output.value]
del ordinals[:output.value]
coinbase_ordinals.extend(ordinals)
for output in block.transactions[0].outputs:
output.ordinals = coinbase_ordinals[:output.value]
del coinbase_ordinals[:output.value]
这个函数用于为给定的比特币块分配序数。它首先计算块的第一个和最后一个奖励的序数范围。接下来,它迭代块中的每个交易,为每个输出分配序数。最后,为交易的输出分配序数,以确保整个块中的所有聪都有唯一的序数。
简而言之,通过序数理论,oridinals将本质上每个相同的聪(Satoshi) 通过加工变得独一无二起来,并且通过规则为每一个聪定义稀有熟悉, 实现收藏属性或者适制定玩法的规则。
Atomicals 协议是一个简单而灵活的协议,用于在未花费的交易输出(UTXO)区块链(如比特币)上铸造、转移和更新数字对象(传统上称为非同质化代币)。一个 Atomical(或称为 “atom”) 是一种管理数字对象的创建、转移和更新的方式 — — 本质上是根据一些简单规则定义的数字所有权链。
Arc-20采用了染色币模型,也就是说一个Arc-20 token都必须有一个聪支持,而非像Brc-20通过排序进行区分。由于Arc-20 代币完全基于聪,使得他可以像Btc一样进行拆分和合并(也就是文章开头提及的UTXO),并且可以直接通过比特币网络进行转帐。
举例说明,通过Atomicals 协议,我们将指定的100个聪定义为100张“电影票”,用户可以在支持Atomicals协议的电影院,拿这100个聪中的一个来支付,充当电影票的职能
但是矿工和比特币网络并不能知道哪个UTXO经过了”Atomicals”化,从而可能误把Arc-20代币当成矿工费用,为了解决这一问题,Artomicals通过指令操作,将每一个Arc-20代币都作为交易的第一个输出来避免代币的误销毁。
接下来,我们将分析比较两个协议的异同。
协议大致分为三步
{
“p”: “brc-20”,
“op”: “deploy”,
“tick”: “ordi”,
“max”: “21000000”,
“lim”: “1000”
}
由于部署者在部署代币时,代币信息本身无法被BTC所识别,因此需要一个索引器(indexer)来获取链上相关数据并通过该数据在链下创建一个账本来记录相关历史以及处理相关操作并进行数据更新。
链下索引器需要精准的捕获每次一代币操作并更新线下账本。但同区块链一样,随着交易的增多,节点存储的数据将会越来越大,如何保证账本的完整性以及在庞大的数据量中找到需要更改的信息,将会成为brc-20的挑战
同样的,Arc-20协议在部署代币时也需要在BTC链上根据格式记录相关信息
program.command(‘init-dft’)
.description(‘Initialize fungible token (FT) atomical in decentralized issuance mode’)
.argument(‘<ticker>’, ‘string’)
.argument(‘<mint_amount>’, ‘number’)
.argument(‘<max_mints>’, ‘number’)
.argument(‘<mint_height>’, ‘number’)
.argument(‘<file>’, ‘string’)
.option(‘—rbf’, ‘Whether to enable RBF for transactions.’)
.option(‘—funding <string>’, ‘Use wallet alias wif key to be used for funding and change’)
.option(‘—satsbyte <number>’, ‘Satoshis per byte in fees’, ‘15’)
.option(‘—mintbitworkc <string>’, ‘Whether to require any bitwork proof of work to mint. Applies to the commit transaction.’)
.option(‘—mintbitworkr <string>’, ‘Whether to require any bitwork proof of work to mint. Applies to the reveal transaction.’)
.option(‘—bitworkc <string>’, ‘Whether to put any bitwork proof of work into the token mint. Applies to the commit transaction.’)
.option(‘—bitworkr <string>’, ‘Whether to put any bitwork proof of work into the token mint. Applies to the reveal transaction.’)
.option(‘—parent <string>’, ‘Whether to require a parent atomical to be spent along with the mint.’)
.option(‘—parentowner <string>’, ‘Wallet owner of the parent to spend along with the mint.’)
.option(‘—disablechalk’, ‘Whether to disable the real-time chalked logging of each hash for Bitwork mining. Improvements mining performance to set this flag’)
.action(async (ticker, mintAmount, maxMints, mintHeight, file, options) => {
…..
}
在atomicals-js cli源码中可以找到初始化一个代币的相关指令,必须要在链上记录的参数有:
ticker: 代币名称
mint_amount: mint总量
max_mints: 单次mint数量
mint_height: 指定开始mint的区块高度
file: 相关元数据
但与Brc20不同的是, Arc20采用了染色币模型,在代币相关信息录入BTC链上后,该协议将会把代币与Sats做锚定:1 token = 1 sat。
同时,染色币模型的使用使得用户在进行交易时可以直接通过BTC网络实现而非链下账本,因为代币余额与UTXO中的聪保持一致,代币的相关变化都可以在链上直观的反映。索引器在Arc-20中只是用来读取代币在链上的相关部署信息,并且验证哪些是符合Arc-20协议的代币。
Brc-20的设计结构更依赖与链下账本,而Arc-20更符合Btc的相关特性,并且相较于Brc-20会更去中心化。但同时,染色币模型使得Arc-20无法完成meme币的发售,因为meme币往往有很高的代币总数,而1 token = 1 sat这一特性使得在发售meme币时需要消耗大量Btc