Omni Protocol Design
Omni 协议层曾在于比特币协议层与用户货币层之间,旨在成为可以发布个性化货币的基础协议。实现Omni协议的软件将包含一个工具,可以允许人们去设计并发行自定义规则的货币,而不需要去做任何的软件开发。
Initial Token Distribution via the “Exodus Address”(通过Exodus Address
进行初始化的Token发行)
也许你听过比特币协议中的创世块。Omni协议中在块链上也存在类似的起始点,成为Exodus Address
-- 2013.08第一个Mastercoin 生成的bitcoin地址。该Exodus Address
: 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P。
Mastercoins的初始化发行本质上是一个kickstarter 风格的时期,它提供资金给开发者去编写完全实现Omni协议的软件。发行是非常简单的,如下所述:
- 任何在2013.08.31之前发送bitcoin至
Exodus Address
上的人,都不会协议默认拥有发送bitcoin 数量100倍的Mastercoins.例如:如果在2013.08.31之前发送100bitcoin至Exodus Address
, 将会在2013.08.31之后获得10, 000 Mastercoins. - 早期的购买者可以获取额外的Mastercoins, 以鼓励用户认可。
- 在2013.09.01之后发送bitcoin至
Exodus Address
,不会被认为是购买Mastercoin,并且或被退还给发送者。
在购买Mastercoin的交易中多个交易输入的情况下,默认贡献最多资金的地址将拥有Mastercoin。
注意:任何购买Mastercoin的人也会接收到相同数量的测试币,可以用来测试Omni协议的新功能。
最初,Omni交易的唯一有效类型是Simple Send
(在下面的文档中会有详细解释)。在文档中的额外功能将在随后实现,并进行完整测试。
Embedding Omni Protocol Data in the Block Chain(在块链中嵌入Omni协议的数据)
bitcoin有一些鲜为人知的高级功能(例如script),许多人认为可以在未来使用它来实现一些新功能。但是Omni协议没有使用这些高级功能,因为不能保证这些功能是否在未来会被真正支持,而且Omni协议不需要使用这些功能在块链上存储数据。 在块链中嵌入Omni数据的三种实现方法:
- A类 方案是使用虚假的比特币地址来将数据嵌入在块链中(A);
- B类方案是:使用多签名交易来嵌入数据(B)。
- C类方案是:一旦比特币开始支持OP_RETURN操作码,Omni协议可以使用这个操作码来嵌入数据(C)。
- C类方案是最受欢迎的,由于它可证明,可修剪交易输出,避免块链的膨胀和污染。
Special Considerations to Avoid Invalid Transactions (避免无效交易的注意事项)
- Omni交易必须全部来自于持有使用Mastercoins的地址。
- 如果一个钱包的比特币存储在多个地址中,用户或Omni软件必须首先确保将要发送Omni交易的地址有足够的余额来创建交易,然后Omni交易可以成功的从该地址发送。
- 不支持本合并资金到一个地址,然后从该地址进行资金的发送的钱包,不适用于Omni,除非他们修改了这种模式。出于这个原因,在线网站钱包不适合 使用Omni,因为他们可能不支持将其它地址金额合并到一个地址,使用这类钱包可能会造成Mastercoins 永久丢失。
- 除了这些托管钱包之外,比特币地址可以被视为Omni地址,能够存储和使用任何Omni协议的货币。
交易字段定义(19个字段)
Field: Currency identifier
- 描述 : 交易中使用的货币标识
- 字节 : 32-bit 无符号整型,4字节.
- 相关字段 : Ecosystem
- 有效值: * 1,3以及到 2,147,483,647 在主网络中使用。(2,147,483,646 特殊标识) * 1 : Mastercoin * 2, 2,147,483,651以及到4,294,967,295 在测试网络中使用。(测试网络资产和货币字段 最高位被设置,从0x80000003 开始,2,147,483,646 特殊标识) * 2 : Test Mastercoin
Field: Ecosystem
- 描述 : 指定该智能资产是在测试网络进行交易,还是在主网络上进行交易
- 字节 : 8-bit 无符号整型,1字节.
- 相关字段 : Currency Identifier
- 有效值 : 1 主网络; 2测试网络。
Field: Integer-eight byte
Field: Integer-four byte
Field: Integer-one byte
Field: Integer-two byte
Field: Listing identifier (future)
Field: Bitcoin Address
Field: Number of coins
Field: Property type
Field: Response sub-action (future)
Field: String 255 byte null-terminated
Field: Time period in blocks
Field: UTC Datetime
Field: Time period in seconds (future)
Field: Sell offer sub-action
Field: Metadex Sell offer sub-action
Field: Transaction type
- 描述 : MSC 协议被执行的功能
- 字节 : 16-bit 无符号整型, 2字节。
- 相关字段 : Transaction version
- 当前有效类型 : * 0 : Simple Send * 3: Send To Owners * 20: Sell Coins for Bitcoins (currency trade offer) * 21: Offer/Accept Omni Protocol Coins for Another Omni Protocol Currency (currency trade offer) * 22: Purchase Coins with Bitcoins (accept currency trade offer) * 50: Create a Property with fixed number of tokens * 51: Create a Property via Crowdsale with Variable number of Tokens * 52: Promote a Property * 53: Close a Crowdsale Manually * 54: Create a Managed Property with Grants and Revocations * 55: Grant Property Tokens * 56: Revoke Property Tokens * 70: Change Property Issuer on Record
- 未来会添加的类型 : * 2: Restricted Send * 10: Mark an Address as Savings * 11: Mark a Savings Address as Compromised * 12: Mark an Address as Rate-Limited * 14: Remove a Rate Limitation * 30: Register a Data Stream * 31: Publish Data * 32: Create a List of Addresses * 33: Removing Addresses from a List * 40: Offer/Accept a Bet * 60: List Something for Sale * 61: Initiate a Purchase from a Listing * 62: Respond to a Buyer Offer * 63: Release Funds and Leave Feedback * 100: Create a New Child Currency
Field: Transaction version
- 描述 : 交易定义的版本,对于每种交易类型单调独立递增。
- 字节 : 16-bit 无符号整型,2字节。
- 必须/可选 : 必须
- 相关字段 : Transaction type
- 有效值 : 0 到 65535
Transaction Definitions
每种交易有自己版本号支持每个交易定义的变化。到本规范的0.3.5版本,交易类型的字段是4个字节的整型。因为现在仅有17中交易类型,所以该字段的高3个字节的值为0. 对于0.4版本的规范,每个交易信息的首个字段是2字节的版本号,初始值为0,并且交易交易类型字段
为2字节的整型。所以,每个客户端都必须检测交易信息的前两个字节,以决定如何解析信息的剩余部分。如果前两个字节都为0,则消息采用版本0.3.5规范进行解析。如果值大于等于1,则采用与该版本号相关的格式进行解析。
除非由规范明确指出,否则Omni协议交易不可逆。
Omni协议不允许余额为0的地址进行转移,保留,提交coin或将coin托管在第三方平台,这种交易将会标识位失效。
Transferring coins(转账)
转账是从一个地址到另一个地址,或一组地址,或与特定资产持有者成比例的无条件支付行为。
Transfer Coins (Simple Send 普通转账)
描述: 交易类型0 用来标识的普通的转账,将指定类型类型的货币从一个地址转移到另一个地址,具体在Appendix A
中有定义。此交易不能用于转账bitcoin。
除了消息类型字段的约束之外,如果满足下列任何条件,该交易都为无效:
- 发送地址上指定币种的 可用余额为0.
- 转账的金额超过发送地址可使用的金额.
- 转账的币种不存在.
- 转账的币种类型为0.(类型为0的币种表示为: bitcoin)
Filed | Type | Example |
---|---|---|
Transaction version | 交易版本 | 0 |
Transaction version | 交易类型 | 0 |
Currency identifier | 代币标识 | 1(Mastercoin) |
Amount to transfer | 代币数量 | 100,000,000 (1.0 coins) |
发送代币到一个不存在的地址经销毁这些代币,就像bitcoin的行为一样。 [未来准备添加的功能: 如果转账来自一个被标记为“存储”的地址,则有一个时间窗口允许撤销这笔转账] 给其他地址转1 Mastercoin。 仅仅需要16字节,格式如下:
Filed | Type | Example |
---|---|---|
Transaction version | 交易版本 | 0 |
Transaction version | 交易类型 | 0 |
Currency identifier | 代币标识 | 1(Mastercoin) |
Amount to transfer | 代币数量 | 100,000,000 (1.0 coins) |
New Property Creation with Fixed number of Tokens (创建一定数量的新类型的Token)
描述: 交易类型50 用来标识创建一定数量的新类型的Token。 如果创建房产或土地契约类型的Token,则该Token的属性标识应该为1. 不要将10处土地资产 发行的Token数量设置为10(即:为每处土地资产创建一个Token), 因为每处土地资产的价值不同,并且他们不可互换。
一旦这些资产被创建,拥有这些资产的地址会广播此次创建资产的信息。 除了消息类型字段的约束之外,接下来的条件必须满足才能使一个交易有效:
- 当
Property Type
标识一种新的资产时,Previous Property ID
必须为0 - 当
Property Type
标识一种资产被替换或者被附加其他特性时,Previous Property ID
必须是由创建地址生成的货币ID。 -
Property Name
必须是空白或者是NULL。
Filed | Type | Example |
---|---|---|
Transaction version | 交易版本 | 0 |
Transaction type | 交易类型 | 50 |
Ecosystem | 生态系统 | 1(Mastercoin ecosystem) |
Property Type | 资产类型 | 1(不可分割的Tokens) |
Previous Property ID | 货币标识 | 0(对新类型的数字资产) |
Property Category | null 结尾的字符串 | “Companies ” (10 bytes) |
Property Subcategory | null 结尾的字符串 | “Bitcoin Mining ” (15 bytes) |
Property Name | null 结尾的字符串 | “Quantum Miner ” (14 bytes) |
Property URL | null 结尾的字符串 | “tinyurl.com/kwejgoig ” (21 bytes) |
Property Data | null 结尾的字符串 | “ ” (1 byte) |
Number Properties | Tokens 数量 | 1,000,000 (indivisible tokens) |
如果想为“Quantum Miner”公司创建1,000,000数字Token。做成这件事情需要使用一定数量的字节信息,由于使用了 null结尾的字符串,下面的示例使用了80个字节。
Filed | Type | Example |
---|---|---|
Transaction version | 交易版本 | 0 |
Transaction type | 交易类型 | 50 |
Ecosystem | 生态系统 | 1(Mastercoin ecosystem) |
Property Type | 资产类型 | 1(不可分割的Tokens) |
Previous Property ID | 货币标识 | 0(对新类型的数字资产) |
Property Category | null 结尾的字符串 | “Companies ” (10 bytes) |
Property Subcategory | null 结尾的字符串 | “Bitcoin Mining ” (15 bytes) |
Property Name | null 结尾的字符串 | “Quantum Miner ” (14 bytes) |
Property URL | null 结尾的字符串 | “tinyurl.com/kwejgoig ” (21 bytes) |
Property Data | null 结尾的字符串 | “ ” (1 byte) |
Number Properties | Tokens 数量 | 1,000,000 (indivisible tokens) |
Send To Owners cross property support(支持跨资产发送给所有者)
一旦发布的Token被激活,使用版本号为1的交易,通过STO交易将允许Token跨资产传输。
X类型的Token可以被分发给含有Y类型的Token的所有者。
使用STO版本号为1的交易,交易费用显著增加。使用STO版本号为0的交易,交易费用维持不变。
通过Omni core发送STO交易,将Token发送给相同资产的持有者,将会自动发送版本号为0的交易;发送跨资产的STO交易,将会自动发送版本号为1的交易。
Field | Type | Example |
---|---|---|
Transaction version | 16-bit无符号整型 | 65535 |
Transaction type | 16-bit无符号整型 | 65534 |
Tokens to transfer | 32-bit无符号整型 | 6 |
Amount to transfer | 64-bit无符号整型 | 700009 |
Token holders to distribute to | 32-bit无符号整型 | 23 |
新的STO交易格式如下所述:
Field | Type | Example |
---|---|---|
Transaction version | 16-bit无符号整型 | 65535 |
Transaction type | 16-bit无符号整型 | 65534 |
Tokens to transfer | 32-bit无符号整型 | 6 |
Amount to transfer | 64-bit无符号整型 | 700009 |
Token holders to distribute to | 32-bit无符号整型 | 23 |
Appendix A – Storing Omni Protocol data in the blockchain(在块链中存储omni 协议的数据)
Class A transactions (also known as the ‘original’ method)
A类交易是Omni协议的第一种实现方式,利用虚假的bitcoin address 来编码交易数据,并将数据存储在块链上。 交易数据被编码到所述假比特币地址中,然后在单个比特币交易中用作满足以下要求的交易输出:
Further:
- 在解码中,Exodus的输出被忽略。
- 所有不符合类型(P2PKH, P2SH)的交易输入 会使这个交易无效。
- 仅将P2PKH, P2SH类型的输出视为
reference address
. - P2SH 的输出地址是不透明的script-hash。 地址,并且不会分解成可用于赎回此类输出的地址。
- P2SH 在块高度322000时启用。
在A类交易中(注意: 仅允许Simple Send 模式)
- Tokens的发行方可以赎回
Exodus address
输出上的Bitcoin. -
reference address
可以赎回Reference output
上的bitcoin。
Class B transactions (also known as the ‘multisig’ method)
一个交易的构建必须满足一下条件
- 有一个接收者的地址输出(即: reference 地址)。
- 有一个exodus address的输出
- 有一个或多个n-of-m多签名的交易输出,每个输出包含至少两个公钥,第一个是由发送者指定的有效公钥地址,可以用来赎回这个输出上的bitcoin,第二个必须是Omni的数据包,序列号为n, 第三个也必须是Omni的数据包,序列号为n 1.
- Omni数据包 必须按sequence Number的顺序来出现。
- 允许额外的输出。
Further:
- 在解码中,Exodus的输出被忽略。
- 所有不符合类型(P2PKH, P2SH)的交易输入 会使这个交易无效。
- 仅将P2PKH, P2SH类型的输出视为
reference address
. - P2SH 的输出地址是不透明的script-hash。 地址,并且不会分解成可用于赎回此类输出的地址。
- P2SH 在块高度322000时启用。
- 仅多签名的输出被视为数据包。
- 如果剩余多个输出,则发送到地址的第一个输出(如果这样的输出存在)将作为更改被忽略。
- reference address 将由剩余输出中索引最高的那个输出来指定。
在B类交易中:
- Tokens的发行方可以赎回
Exodus address
输出上的Bitcoin. -
reference address
可以赎回Reference output
上的bitcoin。 - 发送地址可以赎回多签名的交易输出。
Appendix B – Regulatory and Legal Compliance - Know Your Jurisdiction(了解您的司法管辖区的法律及法规的合规性)
应该清楚的是:Omni协议在某些地区是受到限制甚至禁止的行为。任何致力于实现Omni协议的人都应该非常仔细的提醒用户了解他们司法管辖区和居住国的监管环境,以便不违反任何法律。用户必须了解他们国家的法律,而不是在体育博彩活动的非法活动的地区从事体育博彩活动。
Appendix E - Understanding the cost of Omni protocol messages (理解Omni协议的信息成本)
一个交易示例(来自于线上的真实交易):
01000000023e982cea6e6dd256731e0535e8a5352ac906c57960731908838c99c06022678c020000006b4830450221009a8ef227a9a5201612fce38c55b03655a6cdab2c206e3eed5f9794ca6aaafc2c02202727829b9ea2adbe2f744ba4fdc1a6e54eab065b1d47d9db805202a670ea3996012103303492ee0de3249840dfeb22a0dd74275c18ef6b3756f0eb0eadbbf3eed4fd9affffffff3794926b386cacf624641f6725e61a7cf54fc19eb94d523c9d9e49ea78699cdd000000006b483045022100df8ed3959383f4bbf5371cfde48aee9451027dec76d1f14db9b42cc1bf41d8c3022038694e522eeec2da8a9d47b74923aabe41d0f7b6cd297c51ee63f3fdd94d049d01210271977291b74f1f5f5c42157e8aae804664eaaeccfd097918450d37f28fb94d77ffffffff 03 4e95000000000000 //金额 19 //25个Byte 76a914d243e6abb9a60fbff430b421d2df4b7d59ec186088ac 2202000000000000 //金额 19 //25个Byte 76a9143851f34d13937b673a7d24a1950bb5b21ce94af388ac
//Omni 协议的存储数据 0000000000000000 //金额 16 //22个Byte Omni 协议的数据 6a 14 //20个字节 6f6d6e69 //Don't kown this field represent. 0000 //Transaction Version 0000 //Transaction Type(Simple Send) 0000001f //Current Identify 00001cde30614b00 //Number of Coins 00000000 //LockTime(交易本身的字段)
在代码中Omni交易的处理位置所在:
func DisconnectTip()
: 在链重组时,会删除旧链上Tip区块,直到分叉点。此时会更新Omni协议重组区块的高度状态(记录本轮重组最高的区块高度)。
mastercore_handler_disc_begin()
mastercore_handler_disc_end()
func ConnectTip()
: 链接一个区块至块链上,此时会对区块内的Omni交易进行解析,然后将结果通知给相应的模块。
mastercore_handler_block_begin
mastercore_handler_tx
mastercore_handler_block_end