# 又来？Brc-20协议的改进版BOP是什么？

By [熊猫撸白.nft](https://paragraph.com/@fomoplz) · 2023-03-18

---

不得不感慨，“币圈一天，人间一年” 这句话不是白叫的。web3的创新速度快地惊人。距离Brc-20协议发布仅两天之后，就有另外一位Hirosystem的开发者Hugo受其启发并提出了一个改进版的协议BOP（Bitcoin ordinals protocols,比特币序数协议)。

该协议同样也是实验性质的，brc-20协议的作者对其也表示了认可，并转发了推文。“改进brc20协议”就像接力棒一样在一个个开发者手中传递下去。（_注：Hiro是一个帮助在比特币二层网络stacks上构建智能合约的基础设施_）

![](https://storage.googleapis.com/papyrus_images/7e5db81ef42cef7f0b13852ea63d300c3846559b1984b05907d2e00840725f81.png)

**BOP的由来**

Hugo发明BOP协议是基于一次对于brc-20协议的讨论，有人提出了质疑，“任何有意义的同质化代币协议都不应该使用JSON格式”（_不清楚brc-20协议格式的，可以查看_[_《BTC链上也能自主发币了？带你了解brc-20协议》_](http://mp.weixin.qq.com/s?__biz=Mzg2MTc3Mjk0Nw==&mid=2247485422&idx=1&sn=00fde16b9f69d05a07f810980b10c272&chksm=ce134a12f964c3045c49338a9c6c64ca6ad3684e939735ef7c90649e3a872b0ea99f13019921&scene=21#wechat_redirect)），理由是：“作为底层协议，我们可以铭刻任意字节，json虽然提高了可读性，但是同时也增大了铭文的体积，第三方服务读取数据时，无需考虑协议的可读性，我们需要一个更加轻量的协议”。于是，Hugo受此启发，就创作了BOP协议

[

GitHub - hugoclrd/bop: bitcoin ordinals protocols
-------------------------------------------------

bitcoin ordinals protocols. Contribute to hugoclrd/bop development by creating an account on GitHub.

https://github.com

![](https://storage.googleapis.com/papyrus_images/98d05454bb49c6a8af5c5501cc889a60bd6a1f0f103985adf4d6447fe27ef2af.png)

](https://github.com/hugocaillard/bop)

![](https://storage.googleapis.com/papyrus_images/ef3725c1a0e52056e036bd297c1254cfba23c288670248b08846df1b5b0544c1.png)

**BOP的协议的格式**

作者已经将第一版草案制作成铭文永久刻在了区块链上，编号是#420142

![](https://storage.googleapis.com/papyrus_images/3c27b3e821282255618e25446b30db5468fc25b3ebc87ec7aa3c39f4590bcedf.png)

当我看到的第一眼，心里直呼:“好家伙好家伙，这是个啥？”，第二眼能看懂但又没完全看懂，接下来让我带大家一步一步拆解这个协议。

    #d   declare/deploy/describe  声明一个协议
    0    协议的ID号
    bft  协议名,bitcoin fungible token
    

#d.0.bft的意思就是**声明一个ID为0，名称为bft的代币标准，并且以后使用同样ID号或者名称的协议都会被忽略。**

从第二行开始就声明了bft协议的发行标准，包括**deploy,mint** 和 **transfer**三个方法声明。

首先来看方法0：**deploy**

    0:deploy     方法0：部署
    &            参数声明符
                 //以下均为deploy方法的参数
    unit:id      代币ID号，无符号整数类型，必须
    word:name    协议名,单词类型,支持小写字母，数字字符和下划线，必须
    uint:?max    代币最大供应量，无符号整数类型，？代表可选，非必须
    uint:?limit  每个铭文可铸造的最大数量限制，无符号整数型，非必须
    

接下来再来看方法1：**mint**

    1:mint        方法1:铸造
    &             参数声明符
                  //以下均为mint方法的参数
    uint:id       代币ID号，无符号整数型，必须
    uint:?amount  铸造的代币数量，无符号整数型，如果被省略，
                  则按照部署时设置的最大数量铸造，可选
    

方法2：**transfer**

    2:!transfer    方法2：转移,前面的！号表示一次转移必须有效
                   可以使用addr?to做安全校验
    &              参数声明符
    uint:id        代币ID号，无符号整数型，必须
    uint:amount    转移的数量,无符号整数型，必须
    addr:?to       接收地址，比特币地址，可选
    

如果有过编程经验的朋友看到这里肯定会联想到初学编程时的\*\*“函数声明”,**函数声明的意思是**给功能起名字和规定参数，方便在程序得其他地方直接调用。\*\*有了“函数声明”，那必然就有“函数实现”，调用bop协议的过程称为"**Call a BOP**",都要以"#c"开头，接下来我将以作者发行的第一个代币"idro"作为例子进行讲解

**部署idro**

#c.0.0,调用ID号为0的协议（也就是上面的bft）的第0个方法（即部署方法）

0，idro这个代币的ID号，其他代币的ID号会递增

idro, 代币名称

21e12, 代币总量，一共是 21000000000000个

\[\[144,2048\] ....\[1728,1\]\],表示从部署的区块开始（**区块高度780310**）每隔144个区块，每次mint的数量减半，从2048开始，差不多每隔一天就会减半，

    #c.0.0&
      0,
      idro,
      21e12,
      [
        [144, 2048],
        [288, 1024],
        [432, 512],
        [576, 256],
        [720, 128],
        [864, 64],
        [1008,32],
        [1152,16],
        [1296,8],
        [1440,4],
        [1584,2],
        [1728,1]
      ]
    

以下是代币减产表,可以根据当前的区块高度算出每次可以mint的最大数量

![](https://storage.googleapis.com/papyrus_images/2ddc7ae9dca7ad5c4b826e4579f9b229dd4801cbb3380ef00c36e4aeaebe1847.png)

**铸造idro**

下一步就是大家最关心的如何铸造的问题，铸造的代码很短，就一行

#c.0.1 调用ID号为0的协议（也就是上面的bft）的第1个方法（即铸造方法）

0，idro这个代币的ID号

这里缺省了数量，会根据当前区块高度按照最大的数量铸造，如果想要指定数量可以在后面添加数量，如一次铸造10个，"#c.0.1&0,10"

    #c.0.1&0
    

还有两点特别值得注意：

**1.在使用第三方铸造工具时,如果它是先mint到自己的内置钱包，然后再转移到你的钱包，代币的余额会保存在工具的钱包中，所以不能使用。**

**2.如果同一区块内发生两个余额变化事件，则费用较高的优先。因此，每个地址每个块只能实现 1 个铸币操作。所以不能使用同一个钱包批量铸造**

在这里介绍一下我们国人团队开发的铸造工具unisat的使用方法：

输入网址：[https://unisat.io/inscribe](https://unisat.io/inscribe)  来到主页，选择 "Text"

![](https://storage.googleapis.com/papyrus_images/f647392d853e4104e9856ce34024bb9572fdbbf596f39d21bb2f12687fbb9055.png)

选择”Single“(单次铸造，旁边是批量铸造)，粘贴文本 "#c.0.1&0" ,点击"Next"

![](https://storage.googleapis.com/papyrus_images/8bb84f97c2ea7baf20e65449ef12f8c40204ba8f0aa8006f21265a90178d2316.png)

粘贴自己的Taproot 钱包地址（bc1p开头），然后选择合适的费率，推荐使用“Normal”以上。

![](https://storage.googleapis.com/papyrus_images/2b2939fa776fd14c2ea7bece2aeae35534bc4af626a327b5342a737e95f44a37.png)

下拉到付款按钮，点击 “submit & pay invoice”

![](https://storage.googleapis.com/papyrus_images/66e99b9a1fdbac0bbb85b979a5f33d6830d95973eb44416dc4365acce3d7a36d.png)

最后用你自己的钱包，向指定的地址付相应数量的btc即可。

![](https://storage.googleapis.com/papyrus_images/c8b4bce5afe37c138eb32d89af69a16f5776ee2ccda8e64a1918cb1d544619dc.png)

**转移idro**

#c.0.2  调用ID号为0的协议（也就是上面的bft）的第2个方法（即转移方法）

0，idro这个代币的ID号

100，转移的代币数量

将该文本铸造成铭文之后，并且发送到要转移的地址即可。

    #c.0.2&0,100
    

**和ERC20对比**

说到代币标准，那么不可避免地会提到以太坊上的代币标准erc20,这是由Fabian Vogelsteller 于2015年11月提出的标准，主要包括名称、符号、总供给量、账户余额和转移等方法。

    function name() public view returns (string)
    function symbol() public view returns (string)
    function decimals() public view returns (uint8)
    function totalSupply() public view returns (uint256)
    function balanceOf(address _owner) public view returns (uint256 balance)
    function transfer(address _to, uint256 _value) public returns (bool success)
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
    function approve(address _spender, uint256 _value) public returns (bool success)
    function allowance(address _owner, address _spender) public view returns (uint256 remaining)                                      
    

**总结**

整个btc上的同质化代币协议还处于设想阶段，我们没有办法确认哪一个协议最终会被认可，但我们能做的是一直跟随生态的发展，一直到一套完整的解决方案出现。如果还有其他问题，欢迎添加下方微信备注“bop”进群。

![](https://storage.googleapis.com/papyrus_images/3be4b32ebfdb998518975e97abd880ae205d94f5cf46b742f49c1806ab0f62a2.png)

[Subscribe](null)

\*\* \*\*

---

*Originally published on [熊猫撸白.nft](https://paragraph.com/@fomoplz/brc-20-bop)*
