# 又来?Brc-20协议的改进版BOP是什么? **Published by:** [熊猫撸白.nft](https://paragraph.com/@fomoplz/) **Published on:** 2023-03-18 **URL:** https://paragraph.com/@fomoplz/brc-20-bop ## Content 不得不感慨,“币圈一天,人间一年” 这句话不是白叫的。web3的创新速度快地惊人。距离Brc-20协议发布仅两天之后,就有另外一位Hirosystem的开发者Hugo受其启发并提出了一个改进版的协议BOP(Bitcoin ordinals protocols,比特币序数协议)。 该协议同样也是实验性质的,brc-20协议的作者对其也表示了认可,并转发了推文。“改进brc20协议”就像接力棒一样在一个个开发者手中传递下去。(注:Hiro是一个帮助在比特币二层网络stacks上构建智能合约的基础设施)BOP的由来 Hugo发明BOP协议是基于一次对于brc-20协议的讨论,有人提出了质疑,“任何有意义的同质化代币协议都不应该使用JSON格式”(不清楚brc-20协议格式的,可以查看《BTC链上也能自主发币了?带你了解brc-20协议》),理由是:“作为底层协议,我们可以铭刻任意字节,json虽然提高了可读性,但是同时也增大了铭文的体积,第三方服务读取数据时,无需考虑协议的可读性,我们需要一个更加轻量的协议”。于是,Hugo受此启发,就创作了BOP协议GitHub - hugoclrd/bop: bitcoin ordinals protocolsbitcoin ordinals protocols. Contribute to hugoclrd/bop development by creating an account on GitHub.https://github.comBOP的协议的格式 作者已经将第一版草案制作成铭文永久刻在了区块链上,编号是#420142当我看到的第一眼,心里直呼:“好家伙好家伙,这是个啥?”,第二眼能看懂但又没完全看懂,接下来让我带大家一步一步拆解这个协议。#d declare/deploy/describe 声明一个协议 0 协议的ID号 bft 协议名,bitcoin fungible token #d.0.bft的意思就是声明一个ID为0,名称为bft的代币标准,并且以后使用同样ID号或者名称的协议都会被忽略。 从第二行开始就声明了bft协议的发行标准,包括deploy,mint 和 transfer三个方法声明。 首先来看方法0:deploy0:deploy 方法0:部署 & 参数声明符 //以下均为deploy方法的参数 unit:id 代币ID号,无符号整数类型,必须 word:name 协议名,单词类型,支持小写字母,数字字符和下划线,必须 uint:?max 代币最大供应量,无符号整数类型,?代表可选,非必须 uint:?limit 每个铭文可铸造的最大数量限制,无符号整数型,非必须 接下来再来看方法1:mint1:mint 方法1:铸造 & 参数声明符 //以下均为mint方法的参数 uint:id 代币ID号,无符号整数型,必须 uint:?amount 铸造的代币数量,无符号整数型,如果被省略, 则按照部署时设置的最大数量铸造,可选 方法2:transfer2:!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的最大数量铸造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 来到主页,选择 "Text"选择”Single“(单次铸造,旁边是批量铸造),粘贴文本 "#c.0.1&0" ,点击"Next"粘贴自己的Taproot 钱包地址(bc1p开头),然后选择合适的费率,推荐使用“Normal”以上。下拉到付款按钮,点击 “submit & pay invoice”最后用你自己的钱包,向指定的地址付相应数量的btc即可。转移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”进群。Subscribe** ** ## Publication Information - [熊猫撸白.nft](https://paragraph.com/@fomoplz/): Publication homepage - [All Posts](https://paragraph.com/@fomoplz/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@fomoplz): Subscribe to updates - [Twitter](https://twitter.com/dajingou1): Follow on Twitter