Omni 协议层曾在于比特币协议层与用户货币层之间,旨在成为可以发布个性化货币的基础协议。实现Omni协议的软件将包含一个工具,可以允许人们去设计并发行自定义规则的货币,而不需要去做任何的软件开发。
Exodus Address
进行初始化的Token发行)也许你听过比特币协议中的创世块。Omni协议中在块链上也存在类似的起始点,成为Exodus Address
-- 2013.08第一个Mastercoin 生成的bitcoin地址。该Exodus Address
: 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P。
Mastercoins的初始化发行本质上是一个kickstarter 风格的时期,它提供资金给开发者去编写完全实现Omni协议的软件。发行是非常简单的,如下所述:
Exodus Address
上的人,都不会协议默认拥有发送bitcoin 数量100倍的Mastercoins.例如:如果在2013.08.31之前发送100bitcoin至Exodus Address
, 将会在2013.08.31之后获得10, 000 Mastercoins.Exodus Address
,不会被认为是购买Mastercoin,并且或被退还给发送者。在购买Mastercoin的交易中多个交易输入的情况下,默认贡献最多资金的地址将拥有Mastercoin。
注意:任何购买Mastercoin的人也会接收到相同数量的测试币,可以用来测试Omni协议的新功能。
最初,Omni交易的唯一有效类型是Simple Send
(在下面的文档中会有详细解释)。在文档中的额外功能将在随后实现,并进行完整测试。
bitcoin有一些鲜为人知的高级功能(例如script),许多人认为可以在未来使用它来实现一些新功能。但是Omni协议没有使用这些高级功能,因为不能保证这些功能是否在未来会被真正支持,而且Omni协议不需要使用这些功能在块链上存储数据。 在块链中嵌入Omni数据的三种实现方法:
每种交易有自己版本号支持每个交易定义的变化。到本规范的0.3.5版本,交易类型的字段是4个字节的整型。因为现在仅有17中交易类型,所以该字段的高3个字节的值为0. 对于0.4版本的规范,每个交易信息的首个字段是2字节的版本号,初始值为0,并且交易交易类型字段
为2字节的整型。所以,每个客户端都必须检测交易信息的前两个字节,以决定如何解析信息的剩余部分。如果前两个字节都为0,则消息采用版本0.3.5规范进行解析。如果值大于等于1,则采用与该版本号相关的格式进行解析。
除非由规范明确指出,否则Omni协议交易不可逆。
Omni协议不允许余额为0的地址进行转移,保留,提交coin或将coin托管在第三方平台,这种交易将会标识位失效。
转账是从一个地址到另一个地址,或一组地址,或与特定资产持有者成比例的无条件支付行为。
描述: 交易类型0 用来标识的普通的转账,将指定类型类型的货币从一个地址转移到另一个地址,具体在Appendix A
中有定义。此交易不能用于转账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) |
描述: 交易类型50 用来标识创建一定数量的新类型的Token。 如果创建房产或土地契约类型的Token,则该Token的属性标识应该为1. 不要将10处土地资产 发行的Token数量设置为10(即:为每处土地资产创建一个Token), 因为每处土地资产的价值不同,并且他们不可互换。
一旦这些资产被创建,拥有这些资产的地址会广播此次创建资产的信息。 除了消息类型字段的约束之外,接下来的条件必须满足才能使一个交易有效:
Property Type
标识一种新的资产时,Previous Property ID
必须为0Property 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\0” (10 bytes) |
Property Subcategory | null 结尾的字符串 | “Bitcoin Mining\0” (15 bytes) |
Property Name | null 结尾的字符串 | “Quantum Miner\0” (14 bytes) |
Property URL | null 结尾的字符串 | “tinyurl.com/kwejgoig\0” (21 bytes) |
Property Data | null 结尾的字符串 | “\0” (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\0” (10 bytes) |
Property Subcategory | null 结尾的字符串 | “Bitcoin Mining\0” (15 bytes) |
Property Name | null 结尾的字符串 | “Quantum Miner\0” (14 bytes) |
Property URL | null 结尾的字符串 | “tinyurl.com/kwejgoig\0” (21 bytes) |
Property Data | null 结尾的字符串 | “\0” (1 byte) |
Number Properties | Tokens 数量 | 1,000,000 (indivisible tokens) |
一旦发布的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 |
A类交易是Omni协议的第一种实现方式,利用虚假的bitcoin address 来编码交易数据,并将数据存储在块链上。 交易数据被编码到所述假比特币地址中,然后在单个比特币交易中用作满足以下要求的交易输出:
reference address
.在A类交易中(注意: 仅允许Simple Send 模式)
Exodus address
输出上的Bitcoin.reference address
可以赎回Reference output
上的bitcoin。一个交易的构建必须满足一下条件
Further:
reference address
.在B类交易中:
Exodus address
输出上的Bitcoin.reference address
可以赎回Reference output
上的bitcoin。应该清楚的是:Omni协议在某些地区是受到限制甚至禁止的行为。任何致力于实现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(交易本身的字段)
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