发布时间:2018年6月10日
网络来源:微信公众号沉风网事
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)
<!–/OL–>
Tether业务层,Tether业务层主要功能如下:
1. 法币兑换Tether(USDT)
2. Tether(USDT)兑换法币
3. 监管流通中Tether(USDT)
流程
流程图
这里与普通交易所的流程类似。法币兑换USDT,发放相应USDT,USDT兑换法币,回收USDT。
交易
具体看一个交易吧。
先上图:
交易信息-1
主要看交易的输入与输出,这里关注点主要在输出,为什么输出有三个呢? 第一个很容易理解,表示找零 第二个表示什么呢?表示转帐对方的地址,具体参考wiki 第三个OP_RETURN用于存储Tether部分转帐信息
交易信息-2
图中的0x155十六进对应十进制341,在染色币的体系中对应类型表示Tether,具体参考染色币列表。 转帐的数量在哪里体现呢?转帐数字为000002ba7def3000,占用8个字节。对应十进制数字结果为:
交易信息-3
图中显示的Tether的交易的信息,这些交易信息来自比特币交易信息。
omni封装OP_RETURN信息代码如下:
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 payload = CreatePayload_SimpleSend(propertyId, amount);
return HexStr(payload.begin(), payload.end());
}
小结
USDT并没有自己的公有链,而是在比特币交易交易中利用比特币OP_RETURN来保存USDT交易信息。
逻辑上两条链,数据上一条链
USDT钱包地址与比特币地址等同
非交易所内的USDT转帐实际上bitcoin转帐
<!–/OL–>