OP_RETURN
在进入正题前,我们需要了解比特币脚本OP_RETURN。
OP_RETURN是比特币0.9版本引入支持一种新的操作符,目的是允许开发者在交易上输出增加40个字节自定义的非交易数据。更多详细信息参考OP_RETURN wiki
USDT
USDT又名Tether,通过Tether提供1:1美元兑换服务,为法币与数字货币提供兑换服务。
国内交易所关闭后,国内玩币的人都知道,这里不过多介绍。
架构
各层介绍如下:
比特币区块链层,主要实现Tether分布式帐本功能。Tether交易信息通过OP_RETURN保存在比特币的分布式帐本中。
Omni协议层,Omni协议层主要功能如下:
- 创建与销毁USDT
- 提供OmniApi
- 跟踪Tether流通,通过Omnichest.info提供区块链浏览器功能
- 支持用户交易与保存Tether(USDT)
Tether业务层,Tether业务层主要功能如下:
- 法币兑换Tether(USDT)
- Tether(USDT)兑换法币
- 监管流通中Tether(USDT)
流程
这里与普通交易所的流程类似。法币兑换USDT,发放相应USDT,USDT兑换法币,回收USDT。
交易
具体看一个交易吧。
先上图:
主要看交易的输入与输出,这里关注点主要在输出,为什么输出有三个呢?
第一个很容易理解,表示找零
第二个表示什么呢?表示转帐对方的地址,具体参考wiki
第三个OP_RETURN用于存储Tether部分转帐信息
图中的0x155十六进对应十进制341,在染色币的体系中对应类型表示Tether,具体参考染色币列表。
转帐的数量在哪里体现呢?转帐数字为000002ba7def3000,占用8个字节。对应十进制数字结果为:
1
2
|
>>> int('0x000002ba7def3000',16)
3000000000000L
|
图中显示的Tether的交易的信息,这些交易信息来自比特币交易信息。
omni封装OP_RETURN信息代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
UniValue omni_createpayload_simplesend(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 2)
throw runtime_error(
"omni_createpayload_simplesend propertyid \"amount\"\n"
"\nCreate the payload for a simple send transaction.\n"
"\nArguments:\n"
"1. propertyid (number, required) the identifier of the tokens to send\n"
"2. amount (string, required) the amount to send\n"
"\nResult:\n"
"\"payload\" (string) the hex-encoded payload\n"
"\nExamples:\n"
+ HelpExampleCli("omni_createpayload_simplesend", "1 \"100.0\"")
+ HelpExampleRpc("omni_createpayload_simplesend", "1, \"100.0\"")
);
uint32_t propertyId = ParsePropertyId(params[0]);
RequireExistingProperty(propertyId);
int64_t amount = ParseAmount(params[1], isPropertyDivisible(propertyId));
std::vector<unsigned char> payload = CreatePayload_SimpleSend(propertyId, amount);
return HexStr(payload.begin(), payload.end());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
std::vector<unsigned char> CreatePayload_SimpleSend(uint32_t propertyId, uint64_t amount)
{
std::vector<unsigned char> payload;
uint16_t messageType = 0;
uint16_t messageVer = 0;
mastercore::swapByteOrder16(messageType);
mastercore::swapByteOrder16(messageVer);
mastercore::swapByteOrder32(propertyId);
mastercore::swapByteOrder64(amount);
PUSH_BACK_BYTES(payload, messageVer);
PUSH_BACK_BYTES(payload, messageType);
PUSH_BACK_BYTES(payload, propertyId);
PUSH_BACK_BYTES(payload, amount);
return payload;
}
|
小结
- USDT并没有自己的公有链,而是在比特币交易交易中利用比特币OP_RETURN来保存USDT交易信息。
- 逻辑上两条链,数据上一条链
- USDT钱包地址与比特币地址等同
- USDT转帐实际上bitcoin转帐(明白了在人民币与美元汇率为6.3情况下,为什么一个USDT的价格7元左右吧)
(Ps:了解USDT的技术原理,后面会从经济与商业的角度分析一下USDT)
参考
- tether
- Api
- TetherWhitePaper
- omnicore
- OP_RETURN
- 比特币浏览器
- Tether浏览器
- OP_RETURN是区块链可扩展性的克星
- omnilayer
- omni_gettransaction
- 比特币浏览器
- populateRPCTransactionObject
- Proposed Standard for Bitcoin Assets