PalletOne技术讲堂之Omni协议简介
Pallet 1周前
讲师介绍:
曾毅,《SQL Server数据库技术大全》作者,从业于IT行业10余年,先后服务于微软、中金、美国硅谷某科技公司以及归国后区块链创业。参与设计、开发和带领团队完成过大量关于企业管理、金融数据处理、商务智能、移动互联网、供应链金融等相关的项目。专注于数据库、数据仓库、大数据和区块链技术。精通比特币、超级账本Fabric的底层原理和应用开发。现为跨链项目PalletOne 联合创始人&架构师。
一、Omni是什么?
Omni(以前的Mastercoin)是基于比特币区块链的数字货币和通信协议。使复杂的财务功能成为一种加密的方式。计划Omni功能包括发展分散交流、智能财产和储蓄钱包。
JR Willett于2012年1月发布了Mastercoin协议的初稿,在白皮书中提出,现有的比特币协议可以用作协议层,在不改变比特币协议的基础上创建新的货币层次。”
Mastercoin也称Omni项目于2013年7月31日正式启动,任何人都可以通过将比特币发送到特殊的“Exodus地址”来购买Mastercoins协议用于进行交易的数字令牌。
2015年3月,Mastercoin被重新命名为Omni。
二、从比特币的基础说起!
比特币基本交易结构:
在上述表格的倒数第2行,即“锁定脚本”可以是一种“备注信息”(请注意,这里是“可以是”),只要是以OP_Return开头的都属于“备注信息”。就像我们使用网银转账可有填写备注一样,这种“备注信息”的“锁定脚本”,即BCH节点来说是不作处理的。我们称这种“备注信息”为OP_Return数据。
但是这种OP_Return数据,都一定会和这笔交易共同存在BCH的区块里的。这句话的意思是:OP_Return数据是受BCH区块链保护的,这个数据是不可篡改,不可伪造的。哪怕是你再发一笔交易,填写完全一样的OP_Return信息,但这笔交易的txid肯定是不一样的,BCH区块链是可以识别“信息完全相同的OP_Return数据”是属于哪笔交易,在哪个区块的。这意味着,一笔交易tx,外带一个OP_Return数据,这两个信息就会是在全世界唯一性地存在。即使是在同一区块里,相同的输入地址和输出地址外加相同的OP_Return数据,的两笔交易,因为UTXO不同,交易加OP_Return也可以形成唯一性,在区块内部可以排到顺序。
OP_Return一旦写入了区块链,就相当于有了一个时间戳,哪怕是同一区块里的交易,都因排序不一样,而有不同的时间戳。这句话是什么意思呢?就类似于,今天的人民日报第2版发表了一篇文章,那这篇文章就带有2018年7月18日这个时间戳。如果明天,在人民日报第2版完全相同的地方,又发表了完全一样的文章,但时间戳是不一样的。
下面的这笔交易就是带一个OP_Return备注信息,OP_Retrun一般会在浏览器的输出列出中显示为“地址解析失败”,然后在浏览器的输出脚本部分显示具体的数据。比如:
https://www.blockchain.com/btc/tx/19ebbdd3911e3dede7e2daa158c4f6f0d316f6c73666bf7764ad3a1a013b819d
三、设计一个Token(货币)
设计货币,最重要的就是三个功能,货币的发行,建立账户,和货币的转移。发行必须有理有据,你不能胡乱发。我们可以约定好,一次性发行,然后永久不增加。也可以约定好按特定的条件来持续增发。只要定义好规则就好。为了方便起见,我们设计一个一次性发行,永久不增加的货币,我们先管它叫TFBC(The First Bticoin cash's token Coin的首字母缩写),发行76亿(全世界人口,一人一个好了)。初次发行,就将所有的币存放到一个账户上。
建立账户就很开户,允许新用户加入到这套货币体系当中来。新开的户,余额是零,然后可以接收币,收到币后可以发送币给别的账户。这个好理解。
货币的转移,或叫支付,是我们使用这个货币的过程。这个过程必须是安全的和让用户可识别的。你不能出现一个人原本是没有币,他却能支付,即这套货币系统需要能识别出哪个账户有币,然后才能支付,也不能支付的总额超过了账户的余额。让用户可识别的就是说,你得让人知道他账户上有多少币,这个不能显示是假的,或者有人造假说自己有多少币,系统得能识别。
有这三个功能,就实现了一套最简化的货币。我们使用一种中心化的思维来设计的话,就是使用一个账本,形象点说,就是一个excel表格。表格的第1列记录的是账户名字,第二列是账户余额。
货币的发行,就直接在excel表里填写一个账户,随便叫个名字,就叫“闪电”好了,余额是76亿。新建账户就是在excel表格里增加一行,比如新建一个叫“雷神”的账户,余额为0。
货币的转移,比如“闪电”这个账户要转1亿个币给“雷神”。要完成这个过程只需要修改两个数,第1是将“闪电”的余额改为75亿,将“雷神”的余额改为1亿,就完成了。
为了保证转移过程的安全性,我们会要求记录所有的历史支付记录。这样可以通过所有的历史记录回溯到初始发行的货币量,回溯就是将支付的过程逆过来,原本“闪电”支付给“雷神”1亿,回溯就变成了“雷神”支付给“闪电”1亿。如果回溯的最终结果和发行是一样的,那就可以说明整个支付过程是没有问题。
有了历史记录,我们也可以对所有的账户余额进行回溯,回溯的结果一定的所有的账户余额都为零(除了初始发行的那个账户)。
那如何保证记录历史支付呢?我们可以直接在excel表的第3列开始就作为支付记录,比如“闪电”支付给“雷神”1亿,则在“闪电”的第3列记录“-1亿”,而在“雷神”的第3列上记录“+1亿”。而每个账户的最终余额,就是这些历史记录的加总。这个列数我们假定是无限的,这样就可以记录无限次数的交易了。
如果我们将上述一张excle表,复制到很多台电脑上,然后这些电脑可以同步更新数据,那我们就使用了去中心化的方式来实现这套最简化的货币体系。
四、Omni协议
但是,如何保证货币的发行和转移是安全的呢?下面我们来讲如何使用Bitcoin Cash区块链来设计一个安全的货币发行和转移系统,即Omni协议。
我们从第1章的描述中就可以看到,因为有OP_Return数据的存在,将Bitcoin Cash的区块链里的OP_Return数据提取出来,就是一个非常好的“excel表”,每一次对这张表的修改,都会被记录在区块链里,而这些数据是不可篡改,不可伪造的。按第2章的描述,就可以利用“OP_Return excel表”来设计一个去中心化的货币发行和转移系统。
现在我们来利用BCH区块链来设计一套最简化的货币系统。
首先是初始发行。
我们使用一个BCH钱包来发一笔带自定义OP_Return数据的交易,交易的输入是自己控制私钥的地址A,输出有两个,第一个输出还是地址A,即这笔交易是自己发给自己,第二个输出是一个OP_Retrun数据。这个OP_Return数据写的意思就是“使用地址A当成创世账户,给这个账户注入76亿个TFBC货币”。这笔交易我们记为“铸币交易tx1。”
因为BCH系统是不会去识别这个OP_Return里的数据的,所有的BCH节点都会直接忽略掉这个数据。那我们给bitcoin cash的节点钱包做一个外挂,这个外挂程序专门用来解析这个OP_Return数据。这个外挂结合上述tx1和这个OP_Return数据,就可以解析出一张excel表格,表格的第一列就是账户“地址A”,第二列就是“余额76亿TFBC”。
因为OP_Return在BCH网络是不会被检验的,可以被随意填写。有没有可能别人也发一笔交易,包含完全相同的OP_Return数据,来伪造我们上面发行的76亿货币呢?答案是不能的,因为他无法伪造tx1,而外挂程序需要结合tx1来解析出这张excel表格。
那么创世交易的的创造者能不能篡改或伪造铸币交易tx1呢,也是不能的,因为创造者可以使用相同的输入和输出,但无法伪造成相同的UTXO,否则就会被BCH网络确定为双花。
在这个新发生的货币体系里,账户是和BTC共用的,新建账户也就是新建一个BTC地址。这个很简单。
转移货币的过程是这样的,第一次转移是从铸币交易往外支付的,比如支付给地址B1亿个币。支付的过程需要使用“铸币地址A”构造一笔BCH交易,输入是地址A,输出之一是地址B,金额为546聪(这是因为BCH网络的防尘设计,如果删掉了这个限制,金额就可以为0),带上矿工费,第二个输出是一个OP_Return,里面的数据写会被解析为“账户A向账户B支付1亿个币”,我们记这笔BCH交易为tx2。
OP_Return里的数据,在BCH网络是不会被处理的,但在上述的BCH的外挂程序里会被解析出来,解析的结果就是更新这张货币的状态表,如下表。
同样的,因为tx2被BCH区块链打包之后,就不可能再被伪造了,除非BCH网络被回滚了。所以这个货币的状态表就无法被伪造了。
只要地址B上有BCH余额可以支付防尘设置和矿工费,就可以给其他地址支付这个货币了,然后外挂程序就会拿这笔交易和OP_Return里的数据,解析更新货币的最新状态表。
以上就是最简化的Omni协议实现的代币的原理,为了更实用性,代币一般会增加很多功能,比如锁定功能,自动化转币功能……
关于Omni字段的详细解释,参见:https://github.com/OmniLayer/spec
五、USDT简介
比特币协议-> Omni 层协议-> USDT
USDT是基于比特币omni协议的一种代币: https://www.omniexplorer.info/asset/31
ID是31
USDT 的协议结构从底层到顶层大致是:「比特币协议-> Omni 层协议-> USDT」,也就是说,USDT 是基于比特币的一种代币(token),就像大大小小的山寨币大多是基于以太坊(ETH)的一种代币一样;另外USDT 也出了最新的以太坊(ERC20 标准)版本,但我看了下发行量和流通量都太小,所以我们这里还是只讨论前面说的基于比特币Omni 层协议的经典USDT。
我顺着Tether官方给我回复的邮件,去这几个地方进行了研究:
- Omni Core 项目主页:https://github.com/OmniLayer/omnicore
- Omni Core RPC 接口文档:https://github.com/OmniLayer/omnicore/blob/master/src/omnicore/doc/rpc-api.md
- Omni Core 客户端下载页:
https://bintray.com/omni/OmniBinaries/OmniCore/view
调研结论大致是这样:我们可以安装并运行一个Omni Core 节点客户端,然后利用其提供的RPC 接口,实现我们USDT 出入金所需的代币发送、接收等功能;我看了下,接口都是挺全的;其中,对于USDT 来说,接口所需要的代币ID 参数「propertyid」值应该是「31」
在Omni创造USDT:
{
amount: "0.00000000",
block: 324140,
blockhash: "00000000000000001e76250b3725547b5887329cfe3a8bb930a70e66747384d3",
blocktime: 1412613555,
category: "Financial and insurance activities",
confirmations: 214428,
data: "The next paradigm of money.",
divisible: true,
ecosystem: "main",
fee: "0.00010000",
ismine: false,
positioninblock: 767,
propertyid: 31,
propertyname: "TetherUS",
propertytype: "divisible",
sendingaddress: "3MbYQMMmSkC3AgWkj9FMo5LsPTW1zBTwXL",
subcategory: "Activities auxiliary to financial service and insurance activities",
txid: "5ed3694e8a4fa8d3ec5c75eb6789492c69e65511522b220e94ab51da2b6dd53f",
type: "Create Property - Manual",
type_int: 54,
url: "https://tether.to",
valid: true,
version: 0
}
在比特币角度看来,数据是这样的:
https://www.blockchain.com/btc/tx/5ed3694e8a4fa8d3ec5c75eb6789492c69e65511522b220e94ab51da2b6dd53f
Output Scripts
DUP HASH160 PUSHDATA(20)[946cb2e08075bcbaf157e47bcb67eb2b2339d242] EQUALVERIFY CHECKSIG
HASH160 PUSHDATA(20)[da59767e81f4b019fe9f5984dbaa4f61bf197967] EQUAL
1 PUSHDATA(65)[04ad90e5b6bc86b3ec7fac2c5fbda7423fc8ef0d58df594c773fa05e2c281b2bfe877677c668bd13603944e34f4818ee03cadd81a88542b8b4d5431264180e2c28] PUSHDATA(33)[02f88f01791557f6d57e6b7ddf86d2de2117e6cc4ba325a4e309d4a1a55015d785] PUSHDATA(33)[02a94f47f4c3b8c36876399f19ecd61cf452248330fa5da9a1947d6dc7a189a134] 3 CHECKMULTISIG
1 PUSHDATA(65)[04ad90e5b6bc86b3ec7fac2c5fbda7423fc8ef0d58df594c773fa05e2c281b2bfe877677c668bd13603944e34f4818ee03cadd81a88542b8b4d5431264180e2c28] PUSHDATA(33)[026d7e7235fc2c6769e351196c9ccdc4c804184b5bb9b210f27d3f0a613654fe38] PUSHDATA(33)[028991cff7cc6d93c266615d2a9223cef4d7b11c05c16b0cec12a90ee7b39cf85d] 3 CHECKMULTISIG
1 PUSHDATA(65)[04ad90e5b6bc86b3ec7fac2c5fbda7423fc8ef0d58df594c773fa05e2c281b2bfe877677c668bd13603944e34f4818ee03cadd81a88542b8b4d5431264180e2c28] PUSHDATA(33)[0229b3e0919adc41a316aad4f41444d9bf3a9b639550f2aa735676ffff25ba3898] PUSHDATA(33)[02f15446771c5c585dd25d8d62df5195b77799aa8eac2f2196c54b73ca05f72f27] 3 CHECKMULTISIG
当前USDT的属性:https://api.omniexplorer.info/v1/property/31
一笔USDT的转账,数据如下:
https://www.omniexplorer.info/tx/fb0c4bbe4d82158461fc91b3c1803ffb43ff847f19de43acc115d0410089d4d0
{
amount: "6.60000000",
blocktime: 1535294659,
confirmations: 0,
divisible: true,
fee: "0.00010166",
flags: null,
ismine: false,
propertyid: 31,
propertyname: "TetherUS",
referenceaddress: "16r5e7ZFivuwPKdua96D9hySq6F8GQHyQb",
sendingaddress: "1FoWyxwPXuj4C6abqwhjDWdz6D4PZgYRjA",
txid: "fb0c4bbe4d82158461fc91b3c1803ffb43ff847f19de43acc115d0410089d4d0",
type: "Simple Send",
type_int: 0,
version: 0
}
其在比特币看来如下:
https://www.blockchain.com/btc/tx/fb0c4bbe4d82158461fc91b3c1803ffb43ff847f19de43acc115d0410089d4d0
Output Scripts
DUP HASH160 PUSHDATA(20)[a25dec4d0011064ef106a983c39c7a540699f220] EQUALVERIFY CHECKSIG
RETURN PUSHDATA(20)[6f6d6e69000000000000001f000000002756cd00]
(decoded) omni'V�
DUP HASH160 PUSHDATA(20)[4020e25c74f643aee2ca57966a7974316cba33e9] EQUALVERIFY CHECKSIG
最后,为什么同样是创造Token,ERC20火了,而Omni却没火?
为什么USDT不用ERC20,而是用Omni?
1.时间问题。
2.背景问题。Omni的创始人及CTO Craig Sellars也是Tether(USDT泰达币)的创始人及前CTO。Craig也是Synereo和Bitfinex的顾问。
参考更多:
PalletOne技术讲堂之BitShares 2.0 多节点私链部署PalletOne技术讲堂之区块链与比特币特辑(一)
区块链世界的IP协议高性能分布式账本
更多有价值的悄悄话,欢迎加入PalletOne社群
添加PalletOne小红微信
加入社区,咨询更多消息
官网:https://pallet.one/
官方邮箱:contact@pallet.one
Telegram:http://t.me/PalletOneOfficialEN
Github:https://github.com/PalletOne
Twitter:https://twitter.com/PalletOne_org
Medium:https://medium.com/palletone
更多官方咨询,关注公众号获得