很久没发技术文了,因为这波就是没什么新技术啊,meme币整天博傻,动物园都快盖好了。
就算是最近被吹上天的BRC-20讲的好像BTC的Defi summer,
https://www.blocktempo.com/is-the-bitcoin-ecosystem-unable-to-replicate
但实际上类似的东西,10年前的BTC在还未有ETH生态系就玩过了。
mastercoin可以玩代币,counterparty还可以玩智能合约咧。
BCH之前也早就玩过SLP token了,USDT甚至有在SLP上发行咧。
https://i.imgur.com/g9zbGoe.png
https://tether.to/en/transparency/#usdt
但这种代币玩法实际上就是劣化版的ERC-20,更不用谈什么defi summer了。
既然原PO讲到了,就来讲一下技术上BRC-20与ERC-20上的不同。
ERC-20是由图灵完备的EVM所执行的程式语言代币标准,EVM是由矿工执行与验证的。
所以ERC-20上的mint, transferFrom等方法当然都是由矿工执行与验证的。
而且因为最新的state都是已经和智能合约储存在区块链上了。
所以所有的代币参与者都可以从区块链上取得最新的"共识"。
整个交易安全都是由区块链确保的,因为矿工已经帮忙验证过了,所以不用重新验证。
更重要的因为是由EVM所执行的,所以自订化程度很高,也可以和后续的DeFi相容。
像是DEX交易,staking,AMM等DeFi玩法,要更详细的资讯可以看下面文章。
https://www.toptal.com/ethereum/create-erc20-token-tutorial
而BTC并不支援图零完备智能合约,
所以从以前到现在的玩法就是把BTC的区块链当作数据库使用。
以前用OP_return可以在BTC上写入额外的资料,
不过Luke等开发者不想让BTC太好用就限缩了OP_return的使用,免得spam attack
https://www.panewslab.com/zh_hk/sqarticledetails/4nl41tx7aw2u.html
https://i.imgur.com/pwzLSUN.png
直到Bitcoin Core用万能的soft-fork完成了taproot升级。
被人发现taproot有bug,不~~是feature。可以用taproot程式码绕过交易大小限制。
可以把整个区块用taproot交易的程式码区段塞满满,当然也就可以塞资料进去
https://web3plus.bnext.com.tw/article/271?
https://i.imgur.com/WronFGn.png
这种方式就是ordinal协议,可以在区块链上附加任何资讯,既然可以加上图片。
那当然也可以也可以附加纯文字档。
就有人想到程式语言的通用资料格式json用来附加交易资讯。这时BRC-20就诞生了。
https://domo-2.gitbook.io/brc-20-experiment/
https://i.imgur.com/KWsUieG.png
譬如创建一个BRC-20代币ORDI就是上面那个json指令。把各个字段定义好就行。
https://i.imgur.com/rFibDxB.png
其他的操作也是简单到有点简陋了。
https://i.imgur.com/yEw1kYd.png
https://i.imgur.com/owNLKej.png
比较特别的就transfer是直接用UTXO机制,ordinal的UTXO跑到哪边就是谁的,
所以只需要填数量就好。
那为什么说这其实是劣化版的ERC-20呢?
因为上面的这些操作指令"矿工不验证",所以其实可以乱写都没差。
譬如说我只有1 ORDI,但是我transfer写我传1000 ORDI都可以被"矿工确认"。
所以就需要靠额外的index server去"验证"那些BRC-20交易是"真的有效"。
这问题就导致了中心化index server的产生,
一般人只能去"相信"这些index server是诚实不作恶的。而非trustless。
就算server诚实,但这也会是安全性的single point of failure。
要入侵单一server比入侵整个区块链网络简单太多了。
https://twitter.com/0xmetazen/status/1723734111704244487
另外一个问题就是这些index server会变成整个系统的效能瓶颈。
这问题以前在BCH SLP上就发生过了,index server常常会overload或是离线。
那就不要只跑一个index server,去中心化跑很多个就好了啊~~~
然后你又会得到一个新问题,可怜啊~~
https://abmedia.io/asset-security-brc-20-version-discrepancy
https://abmedia.io/what-are-the-security-risks-from-inadequate-brc-20
这本身已经是劣化版的ERC-20在劣化的区块链BTC上,问题只会更严重。
永恒牛市需要永恒mempool
https://jochen-hoenicke.de/queue/#BTC,24h,weight
https://i.imgur.com/EgTYcBV.png
然后就有这种玩法:
https://news.cnyes.com/news/id/5412431
https://twitter.com/evilcos/status/1735685957662441563
用低BTC手续费卡住mempool,涨价了就用tailTodd发明的RBF加速交易。
跌价了就ToTheMempool,等它自然被踢出mempool就好。
也难怪Luke把这东西当作bug,还写到CVE list里面了。
https://tinyurl.com/brjms38t
https://i.imgur.com/pwzLSUN.png
因为这种做法问题实际上很多。
所以BCH后来就用CashToken这种矿工验证的代币标准来取代SLP标准了。
回到正题,假如真的要用ETH智能合约写BRC-20这种玩法可以怎么写呢?
首先当然就是摒弃ERC-20标准,因为ERC-20标准里的方法与资料结构都是矿工验证的。
我们只需要把区块链当作数据库使用就好。
下面就随便写一个把智能合约当作字串数据库的程式码,
没经过任何验证检查,只是要方便讲概念。
pragma solidity ^0.8.0;
contract LongStringArray {
string[] public strings;
function write(string memory newString) public {
strings.push(newString);
}
function read() public view returns (string[] memory) {
return strings;
}
}
有最简单write和read function可以读写这个字串数据库。
所以只要用write(newString)写入BRC-20标准的json字串进去理论上就可以使用了。
index server则是用read去读这个字串阵列数据库去验证交易并且得出所有余额。
不过BRC-20有些操作必须改一下,就是因为ETH等EVM链是account模式。
所以mint与transfer的操作必须加上地址字段。
可以额外写这些function,
让合约操作者方便呼叫这些function就可以把这些json格式的指令写入到strings中。
后面就不写了,在EVM链上做这种事情真的是没有意义的事情。
有兴趣的人自己研究吧。