OP_RETURN

在进入正题前,我们需要了解比特币脚本OP_RETURN。

OP_RETURN是比特币0.9版本引入支持一种新的操作符,目的是允许开发者在交易上输出增加40个字节自定义的非交易数据。更多详细信息参考OP_RETURN wiki

USDT

USDT又名Tether,通过Tether提供1:1美元兑换服务,为法币与数字货币提供兑换服务。 国内交易所关闭后,国内玩币的人都知道,这里不过多介绍。

架构

架构图

各层介绍如下:

比特币区块链层,主要实现Tether分布式帐本功能。Tether交易信息通过OP_RETURN保存在比特币的分布式帐本中。

Omni协议层,Omni协议层主要功能如下:

  1. 创建与销毁USDT
  2. 提供OmniApi
  3. 跟踪Tether流通,通过Omnichest.info提供区块链浏览器功能
  4. 支持用户交易与保存Tether(USDT)

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个字节。对应十进制数字结果为:

1
2
>>> int('0x000002ba7def3000',16)
3000000000000L

交易信息-3 图中显示的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;
}

小结

  1. USDT并没有自己的公有链,而是在比特币交易交易中利用比特币OP_RETURN来保存USDT交易信息。
  2. 逻辑上两条链,数据上一条链
  3. USDT钱包地址与比特币地址等同
  4. USDT转帐实际上bitcoin转帐(明白了在人民币与美元汇率为6.3情况下,为什么一个USDT的价格7元左右吧)

(Ps:了解USDT的技术原理,后面会从经济与商业的角度分析一下USDT)

参考

  1. tether
  2. Api
  3. TetherWhitePaper
  4. omnicore
  5. OP_RETURN
  6. 比特币浏览器
  7. Tether浏览器
  8. OP_RETURN是区块链可扩展性的克星
  9. omnilayer
  10. omni_gettransaction
  11. 比特币浏览器
  12. populateRPCTransactionObject
  13. Proposed Standard for Bitcoin Assets