语言/Language
English
Metanet 查询
txid 选取节点
根据交易 txid 选取唯一一个 Metanet 节点,包含此节点与此节点相关的边(父节点)的信息
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/metanet/txid/49ee9cc653ddd8e59b3321ec4d34ad8522bc394e48399931834db0987e26d1d6"
GET metanet/txid/{txid}
响应数据
{
  "code": 200,
  "data": {
    "id": 1007417,
    "height": 637709,
    "blockIndex": 238,
    "nodeTxid": "61145a1f39174a02ae618ab076c5daf46e9a361bad4c0cb64a39f9225711575b",
    "parentTxid": "NULL",
    "nodeAddress": "1PojuVs6VLTSps9DMP6S3qm8g32EvikqYM",
    "parentAddress": "NULL",
    "nodePubkey": "024ce693a669126143bbb9129aec1c4a554220c7350b97f6a8b5fcdcc19f4481f1",
    "parentPubkey": "NULL",
    "outputIndex": 0,
    "time": 1591168235,
    "rootTxid": "NULL",
    "rootAddress": "NULL"
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 翻页 id | 
| nodeTxid | string | 节点交易 id | 
| parentTxid | string | 父交易 id | 
| nodeAddress | string | 节点地址 | 
| parentAddress | string | 父地址 | 
| outputIndex | string | 输出索引号 | 
| time | long | 时间戳 | 
| height | int | 区块高度 | 
| rootTxid | string | 根交易 id | 
| rootAddress | string | 根地址 | 
地址选取节点列表
Metanet 协议中一个节点的 地址(nodeAddress)或者公钥(nodePubkey)可能对应多个 metanet 节点,根据节点的地址或者公钥查询所有对应的节点列表
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/metanet/address/16qVqhQSixSrEk6XNJWv26inug5so72SF5"
GET metanet/address/{nodeAddress/nodePubkey}
请求参数
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 翻页标签(上一次查询的最后一条记录的 id) | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 3,
      "height": 587848,
      "blockIndex": 142,
      "nodeTxid": "49ee9cc653ddd8e59b3321ec4d34ad8522bc394e48399931834db0987e26d1d6",
      "parentTxid": "048e7609c70089ee052ddc7e5bceaec14a22b815b20624bcbebad58bc2415f2c",
      "nodeAddress": "16qVqhQSixSrEk6XNJWv26inug5so72SF5",
      "parentAddress": "1B43Nn9MEW1sTYw57s31XUXoPX3zuM6fBG",
      "nodePubkey": "",
      "parentPubkey": "02164a0d0f2aa2f6840f91f6b658edb6b91a3d0b4b4fb396008002734f6a098085",
      "outputIndex": 0,
      "time": 1561132282
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 翻页 id | 
| nodeTxid | string | 节点交易 id | 
| parentTxid | string | 父交易 id | 
| nodeAddress | string | 节点地址 | 
| parentAddress | string | 父地址 | 
| nodePubkey | string | 节点公钥 | 
| parentPubkey | string | 父公钥 | 
| outputIndex | string | 输出索引号 | 
| time | long | 时间戳 | 
| height | int | 区块高度 | 
选取历史版本
根据 Metanet 协议的定义,如果两个节点 地址(nodeAddress)或者 公钥(nodePubkey)与 parentTxid(父交易 ID) 相同,那么这两个节点互为先后版本,根据 TTOR(拓扑排序)决定版本先后。
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/metanet/history_versions/1DwLduKv9FbxCL1GyB7rZxuUNXh5FJbjb/048e7609c70089ee052ddc7e5bceaec14a22b815b20624bcbebad58bc2415f2c"
GET metanet/history_versions/{nodeAddress/nodePubkey}/{parentTxid}
请求参数
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag(可选) | long | false | 翻页标签 | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 6,
      "height": 587848,
      "blockIndex": 145,
      "nodeTxid": "c10413a3ec3a395804960f337d77b97304d2576a346cb975949f7038552276ef",
      "parentTxid": "048e7609c70089ee052ddc7e5bceaec14a22b815b20624bcbebad58bc2415f2c",
      "nodeAddress": "1DwLduKv9FbxCL1GyB7rZxuUNXh5FJbjb",
      "parentAddress": "1B43Nn9MEW1sTYw57s31XUXoPX3zuM6fBG",
      "nodePubkey": "",
      "parentPubkey": "02164a0d0f2aa2f6840f91f6b658edb6b91a3d0b4b4fb396008002734f6a098085",
      "outputIndex": 0,
      "time": 1561132282
    },
    {
      "id": 5,
      "height": 587848,
      "blockIndex": 144,
      "nodeTxid": "35a1250da21bec3b87c56171a5bdfc58c1e830746f1786340405a49e52880802",
      "parentTxid": "048e7609c70089ee052ddc7e5bceaec14a22b815b20624bcbebad58bc2415f2c",
      "nodeAddress": "1DwLduKv9FbxCL1GyB7rZxuUNXh5FJbjb",
      "parentAddress": "1B43Nn9MEW1sTYw57s31XUXoPX3zuM6fBG",
      "nodePubkey": "",
      "parentPubkey": "02164a0d0f2aa2f6840f91f6b658edb6b91a3d0b4b4fb396008002734f6a098085",
      "outputIndex": 0,
      "time": 1561132282
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 翻页 id | 
| nodeTxid | string | 节点交易 id | 
| parentTxid | string | 父交易 id | 
| nodeAddress | string | 节点地址 | 
| parentAddress | string | 父地址 | 
| nodePubkey | string | 节点公钥 | 
| parentPubkey | string | 父公钥 | 
| outputIndex | string | 输出索引号 | 
| time | long | 时间戳 | 
| height | int | 区块高度 | 
父节点查子节点
根据父节点的 txid(不能为 address,address 对应的节点不唯一,可以先用 address 找出 node 列表,再根据特定的 txid 来查询)
返回所有子节点,包括子节点的所有版本
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/metanet/children/72b34a2890b9699528738a90ea87493a8848a7ec669f837ea386ac18e99474b7"
GET metanet/children/{parentTxid}
请求参数
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag(可选) | long | false | 翻页标签 | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 7,
      "nodeTxid": "bfe99262132497f13376e41b998599ccbf685907f3c82559380580b770e55821",
      "parentTxid": "72b34a2890b9699528738a90ea87493a8848a7ec669f837ea386ac18e99474b7",
      "nodeAddress": "16EYKVbWzyWBr1Fs8h5nYR9PebjqSYhTQK",
      "parentAddress": "1RWhhV21Zx4Hj6XDLL6gUhMsgGQjeaAf3",
      "outputIndex": 0,
      "time": 1561132282
    },
    {
      "id": 5,
      "nodeTxid": "57bd02c1cc7e080aac19fa129a30e409bbe88a199c5abf5ffc40da077a6d3796",
      "parentTxid": "72b34a2890b9699528738a90ea87493a8848a7ec669f837ea386ac18e99474b7",
      "nodeAddress": "12U5Q74XGWNr3ji9H6voS77cGPn533Mzzb",
      "parentAddress": "1RWhhV21Zx4Hj6XDLL6gUhMsgGQjeaAf3",
      "outputIndex": 0,
      "time": 1561132282
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 翻页 id | 
| nodeTxid | string | 节点交易 id | 
| parentTxid | string | 父交易 id | 
| nodeAddress | string | 节点地址 | 
| parentAddress | string | 父地址 | 
| outputIndex | string | 输出索引号 | 
| time | long | 时间戳 | 
| height | int | 区块高度 | 
链上数据查询
txid 查询链上数据详情
根据 txid 来选取交易输出为 OP_RETURN 的数据内容
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/data/tx/5648192b964061498ad7902552f0f6345f8521f67fdfc42946b5cd55f1670b41/0"
GET /data/tx/{txid}
GET /data/tx/{txid}/{outputIndex}
注意:如果不确定 OP_RETURN 的 outputIndex,建议使用前一个接口
响应数据
{
  "code": 200,
  "data": {
    "txId": "5648192b964061498ad7902552f0f6345f8521f67fdfc42946b5cd55f1670b41",
    "height": 625741,
    "index": 0,
    "raw": "AGoiMURTWGk4aHZ4bjZQZDRUYXZobVRLeFU3QlVxUzdjbnhodwxXVENXUTk3U0s1Q1cU5rKz5Y2XL+WRqOWPoy/pobnln44ZMjAyMC0wMy0xMVQxNzowMDowMCswODowMExreyJhcWkiOiI4MyIsInBtMjUiOiIyOSIsInBtMTAiOiIxMTYiLCJzbzIiOiI1Iiwibm8yIjoiMTAiLCJjbyI6IjAuMzI1IiwibzMiOiIxMDEiLCJwb2wiOiJQTTEwIiwicXVhIjoi6ImvIn1NCAF42oXRzUpCQRgG4HuZtRxm5pu/0z0E7cWFuApGp6hWIUgKBknmMsKF1SIICheRtPFmGo+X0TdHtOPpDO3e+fmYh3fql6R5ekwOiOGkRk7aXGLmJs+MYmZM4OLMccwhdfLEwu2Ww0STsOsAY5qGMWcxHh3iMI6dN3HhF1fZ7bt/7GcPk9XHTfZ6j0c2nAAkinFDw13rNq8lSjHAnW6tkqaqaWpHM78y2MoYZRHa5MWPn/ziej3qF1EgdAmlpdlH6UhfHHYovUV1LqytUtFoYevlXfY288+DgkqmOi2ppFDRqkD8V1X+5F+VjKg+p6v50I++8DO/l1M/7xUbE1SVbKCCttv4Aa43pow=",
    "parts": [
      "0",
      "OP_RETURN",
      "1DSXi8hvxn6Pd4TavhmTKxU7BUqS7cnxhw",
      "WTCWQ97SK5CW",
      "河南/周口/项城",
      "2020-03-11T17:00:00+08:00",
      "{\"aqi\":\"83\",\"pm25\":\"29\",\"pm10\":\"116\",\"so2\":\"5\",\"no2\":\"10\",\"co\":\"0.325\",\"o3\":\"101\",\"pol\":\"PM10\",\"qua\":\"良\"}",
      ""
    ]
  },
  "message": null,
  "success": true
}
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易哈希 | 
| height | int | 区块高度 | 
| index | int | 交易输出索引号 | 
| raw | string | BASE64 编码后的原始输出 | 
| parts | array | 输出栈组成 | 
列表查询
根据一定的查询条件查询所有满足该条件的数据。 例如 Webot 上链协议,根据 OP_RETURN 栈的第 3 个 part(bit 协议地址位)来作为 protocol 根据 input 中的 address 信息来区分用户和鉴权。同理还有 weathersv,preev 等应用采用此方式 一次返回 50 条记录,按时间倒序
HTTP 请求
curl --location --request GET 'api.metasv.com/v1/data/list?inputAddress=14PEs4zAtdGAECWhSS9XGNc4FmRoURusFL&protocol=BCHjeepney%20and%20stresstestbitcoin.cash%20(blaster.cash)&start=1533162913&end=1533167175'
GET data/list
请求参数
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| inputAddress(可选) | string | 交易输入中携带此地址 | 
| protocol(可选) | string | OP_RETURN 之后的 bit 协议位 | 
| flag(可选) | long | 翻页标签(上一次查询的最后一条记录的 id) | 
| start (可选) | long | 时间范围起始点的秒级时间戳(闭区间) | 
| end (可选) | long | 时间范围的终止点的秒级时间戳(闭区间) | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 1814788,
      "inputAddress": "14PEs4zAtdGAECWhSS9XGNc4FmRoURusFL",
      "protocol": "BCHjeepney and stresstestbitcoin.cash (blaster.cash)",
      "height": 541584,
      "time": 1533167175,
      "txid": "b08b6050fa4a9e4f22b7fd873d0f58e222266a0874f1ca2d6d6874f3789c025e",
      "outputIndex": 1
    },
    {
      "id": 1814216,
      "inputAddress": "14PEs4zAtdGAECWhSS9XGNc4FmRoURusFL",
      "protocol": "BCHjeepney and stresstestbitcoin.cash (blaster.cash)",
      "height": 541584,
      "time": 1533167175,
      "txid": "43f01c7f88f0a3e0681b7bab28b8a0244c60d37674b8334c95178da5b869b86e",
      "outputIndex": 1
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | int | 翻页 id | 
| inputAddress | string | 输入地址 | 
| protocol | string | 协议 | 
| time | long | 时间戳 | 
| txid | string | 交易 id | 
| outputIndex | int | 输出索引号 | 
B 协议
根据文件名搜索 B 协议(bit://19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut)的文件列表
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/data/b_protocol/twetch_twtext_1583810727714.txt"
GET data/b_protocol/{filename}
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag(可选) | long | false | 翻页标签 | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 1961,
      "filename": "twetch_twtext_1583810727714.txt",
      "time": 1583810733,
      "txid": "6e661935503cce008a273a6a88e5989c424ce4716ebfe0cd843f8079edd006bb",
      "outIndex": null
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | int | 翻页 id | 
| filename | string | 文件名 | 
| time | long | 时间戳 | 
| txid | string | 交易 id | 
| outIndex | int | 输出索引号 | 
交易查询
交易详情
交易详情查询,查询交易详情,输入输出等信息
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/tx/8e3da3d115a685ae28421b5661517e829e495091e6121c8d4b0cd52531a660a2"
GET /tx/{txid}
请求参数
无
响应数据
{
  "code": 200,
  "data": {
    "txDetail": {
      "txid": "8e3da3d115a685ae28421b5661517e829e495091e6121c8d4b0cd52531a660a2",
      "version": 1,
      "lockTime": 0,
      "size": 192,
      "fee": 57,
      "height": 627182,
      "blockIndex": 6,
      "blockHash": "000000000000000000f0d2c432132681f73ef22679ef75aebe7ea190b184b14c",
      "blockTime": 1584787871000,
      "inputCount": 1,
      "outputCount": 1
    },
    "vinList": [
      {
        "parentTxid": "8e3da3d115a685ae28421b5661517e829e495091e6121c8d4b0cd52531a660a2",
        "height": 627182,
        "index": 0,
        "utxoTxid": "be70912d20e4d9639f270c09ff9ddb8e8d2fb676a4460fc8866581e56e884aff",
        "utxoIndex": "5",
        "value": 603,
        "address": "15T6soD5ze5dMoguk7C1cnojWkX7yQPuGN",
        "unlockScript": "SDBFAiEAoPLDAEpUxKLWL+b1I/3JAQ03vQSRcwAgQNDNoMbvkaYCIAEaTknYinzdp5vprXbMbL5riFatLIxQCrXcCBERQriBQSEDisPfwlnGgpyE/nOsS81xUf7zPCh1RuZmZous64/9hTY=",
        "sequence": 4294967295
      }
    ],
    "voutList": [
      {
        "parentTxid": "8e3da3d115a685ae28421b5661517e829e495091e6121c8d4b0cd52531a660a2",
        "height": 627182,
        "index": 0,
        "value": 546,
        "address": "1363FvHSaAA9TgfxZAKQLMVjjdC5WvSjjx",
        "lockScript": "dqkUFuQ3MhFWH2e2tiTUeiO6LQK1zGWIrA==",
        "spentTxid": "",
        "spentIndex": 0,
        "spentHeight": 0,
        "spent": false
      }
    ]
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txDetail | object | 交易详情 | 
| vinList | array | 输入列表 | 
| voutList | array | 输出列表 | 
txDetail
| 字段 | 数据类型 | 
|---|---|
| txid | object | 
| version | int | 
| lockTime | long | 
| size | int | 
| fee | int | 
| height | int | 
| blockIndex | int | 
| blockHash | string | 
| blockTime | long | 
| inputCount | int | 
| outputCount | int | 
vin
| 字段 | 数据类型 | 
|---|---|
| parentTxid | string | 
| height | int | 
| index | int | 
| value | long | 
| address | string | 
| unlockScript | string | 
| sequence | long | 
| utxoTxid | string | 
| utxoIndex | string | 
vout
| 字段 | 数据类型 | 
|---|---|
| parentTxid | string | 
| height | int | 
| index | int | 
| value | long | 
| address | string | 
| lockScript | string | 
| spentTxid | string | 
| spentIndex | int | 
| spentHeight | int | 
| spent | boolean | 
获取生交易
获取 Hex 表示的原始生交易
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/tx/8e3da3d115a685ae28421b5661517e829e495091e6121c8d4b0cd52531a660a2/raw"
GET /tx/{txid}/raw
请求参数
无
响应数据
{
  "code": 200,
  "data": {
    "rawHex": "0100000001ff4a886ee5816586c80f46a476b62f8d8edb9dff090c279f63d9e4202d9170be050000006b483045022100a0f2c3004a54c4a2d62fe6f523fdc9010d37bd049173002040d0cda0c6ef91a60220011a4e49d88a7cdda79be9ad76cc6cbe6b8856ad2c8c500ab5dc08111142b8814121038ac3dfc259c6829c84fe73ac4bcd7151fef33c287546e666668baceb8ffd8536ffffffff0122020000000000001976a91416e4373211561f67b6b624d47a23ba2d02b5cc6588ac00000000"
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| rawHex | string | hex 表示的生交易 | 
区块查询
区块头部信息查询
查询区块头部信息
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/block/1/header"
GET /block/{blockIdentifier}/header
请求参数
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| blockIdentifier | int/string | 区块高度或区块哈希 | 
响应数据
{
  "code": 200,
  "data": {
    "blockHash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",
    "height": 1,
    "version": 1,
    "prevBlockHash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
    "merkleRoot": "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
    "timestamp": 1231469665000,
    "medianTime": 1231469665000,
    "reward": 5000000000,
    "minerAddress": "12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX",
    "txCount": 1,
    "inputCount": 1,
    "outputCount": 1,
    "bits": 486604799,
    "nounce": null,
    "size": 215
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| blockHash | string | 区块哈希 | 
| height | long | 区块高度 | 
| version | int | 版本号 | 
| preBlockHash | string | 前一区块的哈希 | 
| merkleRoot | string | 默克尔树根 | 
| timestamp | long | 时间戳 | 
| medianTime | long | 中位时间 | 
| txCount | long | 交易数量 | 
| inputCount | long | 交易输入数 | 
| outputCount | long | 交易输出数 | 
| bits | long | 目标值 | 
| nonce | long | 随机数 | 
| size | long | 区块大小 | 
区块交易列表查询
查询区块交易信息列表
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/block/100000/txs?limit=10"
GET /block/{blockIdentifier}/txs
请求参数
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| blockIdentifier | int/string | 区块高度或区块哈希 | 
| offset | long | 位移量(可选) | 
| limit | long | 个数上限(最大 50) | 
响应数据
{
  "code": 200,
  "data": [
    {
      "txid": "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87",
      "version": 1,
      "lockTime": 0,
      "size": 135,
      "fee": 0,
      "blockIndex": 0,
      "inputCount": 1,
      "outputCount": 1
    },
    {
      "txid": "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4",
      "version": 1,
      "lockTime": 0,
      "size": 259,
      "fee": 0,
      "blockIndex": 1,
      "inputCount": 1,
      "outputCount": 2
    },
    {
      "txid": "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4",
      "version": 1,
      "lockTime": 0,
      "size": 257,
      "fee": 0,
      "blockIndex": 2,
      "inputCount": 1,
      "outputCount": 2
    },
    {
      "txid": "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d",
      "version": 1,
      "lockTime": 0,
      "size": 225,
      "fee": 0,
      "blockIndex": 3,
      "inputCount": 1,
      "outputCount": 1
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 
|---|---|
| txid | string | 
| version | int | 
| lockTime | long | 
| size | long | 
| fee | long | 
| blockIndex | long | 
| inputCount | long | 
| outputCount | long | 
商户用接口
交易存在查询
查询交易存在与否
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/merchants/tx/exists?txid=826f60e6cd9355774998677e43026fd26716a0ac161ad94322f089ce98492e81"
GET /merchants/tx/exists
请求参数
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 id | 
响应数据
{
  "code": 200,
  "data": {
    "txid": "826f60e6cd9355774998677e43026fd26716a0ac161ad94322f089ce98492e81",
    "exists": true
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | String | 交易 id | 
| exists | Boolean | 是否存在 | 
广播交易
生交易广播
允许广播费率大于 0.25sat/byte 的交易,广播之后系统将会使用 mapi(merchant API)把交易直推矿工,因为 metasv 汇集多个应用的交易,有交易量优势,因此可以从矿工处获取费率优惠,所有从 metasv 广播的应用都可以共享此费率优惠。目前 metasv 支持广播的交易体积上限为 15M,这个上限将来会移除,请关注我们的更新日志(为了防止矿工独揽交易,metasv 在把交易递给矿工之后还会往 metasv 运行的全节点广播一次,以保证交易全网可见。)
| 合作矿池 | 代号 | 公钥 | 
|---|---|---|
| taal.com | TAAL | 03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270 | 
HTTP 请求
curl -X POST \
  https://api.metasv.com/v1/merchants/tx/broadcast \
  -H 'content-type: application/json' \
  -d '{"rawHex":"0200000001e0d2128a554d7793352b3478c2339d4c6ba12f294584a2bcfd494daa106769e7000000006b483045022100863549e778bba1f8f8617c77bb286d161463a7b1ebd68d58c9e60e7f96c9afde022038d693ffe511685471b199ed90a806ac84e4ba2ab66ac1f3e160eb5f129452ab4121038fc908bdbac664624c0cca5e1c2c80a73af51f237e95a45b56f1a45446cb1a9bffffffff01bc020000000000001976a914950a65a1ffdde0931dcf2e3b0a1ce8142d43bfb888ac00000000"}'
POST /merchants/tx/broadcast
请求体
| 参数 | 数据类型 | 描述 | 
|---|---|---|
| rawHex | string | 十六进制交易 | 
响应数据
{
  "code": 200,
  "data": {
    "hash": "b8193728dce79f9c1c370670ae428326e3afe96210d072dba38a29d1bf1e1e18",
    "error": null,
    "minerName": "TAAL",
    "minerResponse": {
      "payload": "{\"apiVersion\":\"0.1.0\",\"timestamp\":\"2020-05-17T06:56:10.039Z\",\"txid\":\"b8193728dce79f9c1c370670ae428326e3afe96210d072dba38a29d1bf1e1e18\",\"returnResult\":\"success\",\"resultDescription\":\"\",\"minerId\":\"03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270\",\"currentHighestBlockHash\":\"000000000000000002dc558abcd3caf9a2c5560ad346dabff7af51ebba356cb3\",\"currentHighestBlockHeight\":635273,\"txSecondMempoolExpiry\":0}",
      "publicKey": "03e92d3e5c3f7bd945dfbf48e7a99393b1bfb3f11f380ae30d286e7ff2aec5a270",
      "signature": "304402203effd0188f1d61fc78fb38b05fdaf99dcf363c6c73384b98895088d10549c9ad02201bdb2dd106e3090af2eb51bdc8f766ccabe34c4dc58d08bda2ad98daab80f2eb",
      "encoding": "UTF-8",
      "mimetype": "application/json"
    }
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| hash | string | 交易哈希 | 
| error | object | 错误 | 
| minerName | string | 直推的 miner 名 | 
| minerResponse | object | miner 通过 mapi 回传的带签名信息 | 
error
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| code | int | 全节点错误码 | 
| message | string | 错误信息 | 
minerResponse
详情请参考 mapi 定义
https://github.com/bitcoin-sv-specs/brfc-merchantapi
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| payload | string | 矿工返回的消息体 | 
| publicKey | publicKey | 矿工公钥 | 
| signature | signature | 矿工签名 | 
| encoding | encoding | payload 编码方式 | 
| mimetype | mimetype | payload 媒体类型 | 
全节点常见错误码
| 错误类型 | 错误码 | 错误信息 | 
|---|---|---|
| RPC_MISC_ERROR | -1 | exception thrown in command handling | 
| RPC_TYPE_ERROR | -3 | Unexpected type was passed as parameter | 
| RPC_INVALID_ADDRESS_OR_KEY | -5 | Invalid address or key | 
| RPC_OUT_OF_MEMORY | -7 | Ran out of memory during operation | 
| RPC_INVALID_PARAMETER | -8 | Invalid, missing or duplicate parameter | 
| RPC_DATABASE_ERROR | -20 | Database error | 
| RPC_DESERIALIZATION_ERROR | -22 | Error parsing or validating structure in raw format | 
| RPC_VERIFY_ERROR | -25 | General error during transaction or block submission | 
| RPC_VERIFY_REJECTED | -26 | Transaction or block was rejected by network rules | 
| RPC_VERIFY_ALREADY_IN_CHAIN | -27 | Transaction already in chain | 
"reject" 信息码
| 错误类型 | 错误码 | 
|---|---|
| REJECT_MALFORMED | 0x01 | 
| REJECT_INVALID | 0x10 | 
| REJECT_OBSOLETE | 0x11 | 
| REJECT_DUPLICATE | 0x12 | 
| REJECT_NONSTANDARD | 0x40 | 
| REJECT_DUST | 0x41 | 
| REJECT_INSUFFICIENTFEE | 0x42 | 
| REJECT_CHECKPOINT | 0x43 | 
| REJECT_TOOBUSY | 0x44 | 
挑选 Utxo 集
给定地址集和金额,挑选大于该金额的 Utxo 集 对于 HD 钱包,可以同时传入多个地址地址,给出一个待花费总金额 amount,取出总额大于 amount 的 utxo
注意:此接口选取出来的 amount 并未计算手续费,因此调用方在传入 amount 的时候需要多设置一些金额以保证手续费足够。
HTTP 请求
curl --location --request POST 'https://api.metasv.com/v1/merchants/utxo_select' \
--header 'Content-Type: application/json' \
--data-raw '{"addresses": ["12higDjoCCNXSA95xZMWUdPvXNmkAduhWv", "19k8nToWwMGuF4HkNpzgoVAYk4viBnEs5D"], "amount": 102891277}'
POST /merchants/utxo_select
请求体
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| addresses | array | 待取 utxo 的地址列表 | 
| amount | long | 待取金额(satoshi) | 
{
  "addresses": [
    "12higDjoCCNXSA95xZMWUdPvXNmkAduhWv",
    "19k8nToWwMGuF4HkNpzgoVAYk4viBnEs5D"
  ],
  "amount": 102891277
}
响应数据
{
  "code": 200,
  "data": [
    {
      "outputIndex": 0,
      "address": "12higDjoCCNXSA95xZMWUdPvXNmkAduhWv",
      "txid": "0a21079a06c523fed3a41f890c4e96bb148433c90bf42d3c12649846af20f5b6",
      "id": 31537708,
      "ancestors": 0,
      "descendents": 0,
      "value": 100000000,
      "height": 576232
    },
    {
      "outputIndex": 0,
      "address": "12higDjoCCNXSA95xZMWUdPvXNmkAduhWv",
      "txid": "166a3ab4254f7dbb0a9ea5750bdc19254fb8597b30a8c393b8a48d3f73939775",
      "id": 20292332,
      "ancestors": 0,
      "descendents": 0,
      "value": 666000,
      "height": 576241
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 id | 
| address | string | 地址 | 
| height | int | 高度(未确认 utxo 为-1) | 
| value | long | 金额 | 
| id | long | 翻页 id | 
| outputIndex | int | 索引 | 
| ancestors | int | 祖先数(已确认 utxo 为 0) | 
| descendents | int | 后代数(已确认 utxo 为 0) | 
如果当前 address 余额总和小于要选取的金额,则返回错误码 20001 以及当前的余额,如果要获取全量 utxo,请使用此余额作为 amount 再次请求一遍。
{
  "code": 20001,
  "data": {
    "balance": 102891278
  },
  "message": "Utxo total amount is insufficient",
  "success": false
}
Paymail 地址查询
Paymail 是一系列比特币 SV 钱包协议,这些协议允许在整个生态系统中的所有钱包中提供简化的地址管理服务。
不用直接管理一系列复杂难以记忆的地址,而是通过记住自己的 paymail 邮箱地址,就可以映射到自己的地址。
关于 Paymail 协议的详情,请参考 Paymail Protocol
HTTP 请求
curl --location --request GET 'api.metasv.com/v1/merchants/paymail/bitcoinscl@moneybutton.com'
GET /merchants/paymail/{alias}@{domain}
响应数据
{
  "code": 200,
  "data": {
    "email": "bitcoinscl@moneybutton.com",
    "publicKey": "03db230f7ac74a7193048f10b893c10bc8d3c43b6e151c3ca7fc1b1cd1e9627e6d",
    "address": "1EXyJR3pzvSz8Xg6ux23TFkz8hUjUTL5xW",
    "url": "https://www.moneybutton.com/api/v1/bsvalias/id/bitcoinscl@moneybutton.com"
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| string | 邮箱地址 | |
| publicKey | string | 公钥 | 
| address | string | 可使用的地址 | 
| url | string | paymail 解析 url | 
地址查询
地址基本信息
查询地址基本信息,参数支持地址和 pubKey
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/address/1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz/info"
GET /address/{addressIdentifier}/info
响应数据
{
  "code": 200,
  "data": {
    "id": null,
    "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
    "confirmedBalance": 12504971819,
    "unconfirmedBalance": 0,
    "firstSpend": 1502122852000,
    "firstSpendHeight": 478751,
    "firstReceive": 1501746239000,
    "firstReceiveHeight": 478583,
    "lastSpend": 1591574628000,
    "lastSpendHeight": 638383,
    "lastReceive": 1591604088000,
    "lastReceiveHeight": 638452,
    "txCount": 22954,
    "totalIncome": 25731818063550,
    "totalOutcome": 25719313091731
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 无 | 
| address | string | 地址 | 
| confirmedBalance | long | 确认余额 | 
| unconfirmedBalance | long | 未确认余额 | 
| firstSpend | long | 首次支出时间 | 
| firstSpendHeight | int | 首次支出高度 | 
| firstReceive | long | 首次收入时间 | 
| firstReceiveHeight | int | 首次收入高度 | 
| lastSpend | long | 最后支出时间 | 
| lastSpendHeight | int | 最后支出高度 | 
| lastReceive | long | 最后收入时间 | 
| lastReceiveHeight | int | 最后收入高度 | 
| txCount | long | 交易数量 | 
| totalIncome | long | 总收入 | 
| totalOutcome | long | 总支出 | 
地址交易列表
查询地址历史交易列表,参数支持地址和 pubKey
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/address/1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz/tx?limit=10"
GET /address/{addressIdentifier}/tx
请求参数
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| flag | string | 翻页标签(可选) | 
| limit | int | 数量上限,最大 100(可选,默认 50) | 
响应数据
{
  "code": 200,
  "data": {
    "flag": "h_1591856308000_76785125",
    "transactions": [
      {
        "id": 77427768,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591936092000,
        "height": 638985,
        "income": 625250909,
        "outcome": 0,
        "txid": "99561557fb56b53a026e7c5043542a1c27104859beb4cb65a1a68dc838dd53a3"
      },
      {
        "id": 77310381,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591922015000,
        "height": 638962,
        "income": 0,
        "outcome": 1875825044,
        "txid": "9b8344c79f68094c02240bb093542f310bcd0fc416a161130617a1f12ce8173a"
      },
      {
        "id": 77247902,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591910347000,
        "height": 638949,
        "income": 625113306,
        "outcome": 0,
        "txid": "16796544c87dab68c5287b60ffe4f44b569a4171d967aca339e3fe99ee13a999"
      },
      {
        "id": 77124605,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591896582000,
        "height": 638927,
        "income": 625152761,
        "outcome": 0,
        "txid": "25cc416ae22bbd5bc5614acdadcca86522b1f3a99254a02ae86aeaadba75c162"
      },
      {
        "id": 76965728,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591877219000,
        "height": 638903,
        "income": 0,
        "outcome": 5627506777,
        "txid": "3cca533e1553a19044f0d7d2a8e37db0ea1a909b774dcd5de7db7e61900c95fb"
      },
      {
        "id": 76960828,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591876353000,
        "height": 638898,
        "income": 625071036,
        "outcome": 0,
        "txid": "e308fc17a976a8b110881b12dd5a134067442fecb7dc93f8f3d319cbee3de415"
      },
      {
        "id": 76949119,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591874978000,
        "height": 638895,
        "income": 625127587,
        "outcome": 0,
        "txid": "eb388edfecc69dcb0db184af937c4855731b45b1f7ff137ea445b1362853fbef"
      },
      {
        "id": 76814075,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591861906000,
        "height": 638880,
        "income": 625300161,
        "outcome": 0,
        "txid": "7d264a613657e35710ed1cbc822a5bf619d1bbb00bb0f49ca5d35833bf2fab57"
      },
      {
        "id": 76798308,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591858108000,
        "height": 638875,
        "income": 625145054,
        "outcome": 0,
        "txid": "a4e6f017d1dd7fa1533c8b58074048575ed5e59cd6b9b5c5db0d234ae2ab63e0"
      },
      {
        "id": 76785125,
        "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
        "time": 1591856308000,
        "height": 638868,
        "income": 625026889,
        "outcome": 0,
        "txid": "4228fb498e0b1b137c98a7164d1b99f88c10ddb8184ba1cc63cc1f93b6901fdb"
      }
    ]
  },
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| flag | string | 翻页标签 | 
| transactions | array | 地址列表 | 
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| id | long | 翻页 id | 
| address | string | 地址 | 
| time | long | 时间戳 | 
| height | int | 高度 | 
| income | long | 收入 | 
| outcome | long | 支出 | 
| txid | string | 交易 id | 
地址余额
地址余额查询,包括已确认余额和未确认余额
HTTP 请求
curl --location --request GET "https://api.metasv.com/v1/address/1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz/balance"
GET /address/{address}/balance
响应数据
{
  "code": 200,
  "data": {
    "address": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
    "confirmedBalance": 43783170730,
    "unconfirmedBalance": 0
  },
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| address | string | 地址 | 
| confirmed | long | 确认余额 | 
| unconfirmed | long | 未确认余额 | 
地址 utxo 查询
翻页查询给定地址的 utxo 集,每页最多返回 50 条记录 优先取确认数多的 utxo
HTTP 请求
curl --location --request GET 'api.metasv.com/v1/address/12higDjoCCNXSA95xZMWUdPvXNmkAduhWv/utxo'
GET /address/{address}/utxo
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 翻页标签(上一次查询的最后一条记录的 id) | 
响应数据
{
  "code": 200,
  "data": [
    {
      "id": 4701050,
      "address": "12higDjoCCNXSA95xZMWUdPvXNmkAduhWv",
      "txid": "3541514998f58a38443878d0904033f519cb26820e9d88ccb5b22a90c3f34d1b",
      "outputIndex": 0,
      "value": 500000,
      "height": 576239,
      "ancestors": 0,
      "descendents": 0
    },
    {
      "id": 5376917,
      "address": "12higDjoCCNXSA95xZMWUdPvXNmkAduhWv",
      "txid": "e798e31cecf8a73ecf66402e702d28a91f99be46c09bee73a2e04a2068f2451f",
      "outputIndex": 0,
      "value": 9990,
      "height": 576240,
      "ancestors": 0,
      "descendents": 0
    }
  ],
  "message": null,
  "success": true
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 id | 
| address | string | 地址 | 
| height | int | 高度(未确认 utxo 为-1) | 
| value | long | 金额 | 
| id | long | 翻页 id | 
| outputIndex | int | 索引 | 
| ancestors | int | 祖先数(已确认 utxo 为 0) | 
| descendents | int | 后代数(已确认 utxo 为 0) | 
MetaStream 流订阅
为了方便开发者获取最新最实时的链上数据,我们开发了MetaStream流式推送 api。客户端使用长连接链接到服务器订阅某些信息,如果客户端关心的交易在链上发生,则服务器就会使用 SSE(Server Sent Event)的形式,以 http 中的 text/event-stream 流推送将实时数据推送给客户端。
此功能特别适合一些需要实时性的链上应用使用,如链上聊天室,收款实时推送,钱包充值提醒,链上实时统计(bitcoinblocks.live)等,MetaSV 会帮应用做好 filter 的功能,只推送用户关心的数据给客户端。
通用说明
订阅流推送,服务器返回的推送 message 中,有如下三种类型
{"type":"OPEN","data":""}
{"type":"HEARTBEAT","data":""}
{"type":"DATA","data":{"txid":"17140bb8784344a38c72f3041ae884fc86cda2f2d431b76ce6ad954d11890de6","time":1586600513456511000}}
其中的 type 类型和含义如下
| type 类型 | 含义 | 
|---|---|
| OPEN | 开始建立连接的通知标志 | 
| HEARTBEAT | 长连接默认超时时间为 1 分钟,因此服务器每 30 秒会推送心跳数据保持连接 | 
| DATA | 推送数据 | 
对于推送的数据中,存在一个 time 字段,为 unix 时间戳(精度为纳秒)
所有请求都带有一个 flag 参数(可选)
实时性说明
订阅区块信息
订阅区块信息可以实时获取链上的出块事件,以及块的一些详细内容
HTTP 请求
curl --location --request GET 'https://api.metasv.com/v1/stream/block'
GET /stream/block
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 重放标签(需要重放推送的时间点),纳秒时间戳 1586600513456511000 | 
响应数据
{
  "type": "DATA",
  "data": {
    "block": {
      "blockHash": "0000000000000000046bdee35b14794ed21035e2322a5687dcd7d40879639ac1",
      "height": 630093,
      "version": 536870912,
      "prevBlock": "000000000000000005c4e4e1ee3f969f448964d90540342a7c1d6b17c5edd6c2",
      "merkleRoot": "49113fd51c48763df8b54ad8b08694bb9e08507541703d1362606083f889b46b",
      "timeStamp": 1586601469000,
      "medianTime": 1586599227000,
      "reward": 625285073,
      "minerAddress": "1P3GQYtcWgZHrrJhUa4ctoQ3QoCU2F65nz",
      "txCount": 1301,
      "bits": 403043979,
      "nonce": 3442284989,
      "size": 591171,
      "inputCount": 2804,
      "outputCount": 4332,
      "miner": "minerName",
      "coinbase": "coinbaseMessage written by miner"
    },
    "time": 1586601509955212000
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| blockHash | string | 区块 hash | 
| height | int | 区块高度 | 
| version | int | 区块版本号 | 
| prevBlock | string | 前一个区块 hash | 
| merkleRoot | string | merkle 根 | 
| timeStamp | long | 区块时间戳(毫秒) | 
| medianTime | long | 区块中位数时间(秒级) | 
| reward | long | 区块奖励 | 
| minerAddress | string | 矿工地址 | 
| txCount | int | 区块中包含的交易数 | 
| bits | long | 区块 bits | 
| nonce | int | 区块 nonce | 
| size | int | 区块大小 | 
| inputCount | int | 区块中 input 个数 | 
| outputCount | int | 区块中 output 个数 | 
| miner | string | 解析出来的 miner 名称 | 
| coinbase | string | 解析后的 coinbase 消息 | 
订阅实时交易 hash
订阅实时交易,推送正在发生的全量交易 hash
HTTP 请求
curl --location --request GET 'https://api.metasv.com/v1/stream/tx'
GET /stream/tx
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 重放标签(需要重放推送的时间点),纳秒时间戳 1586600513456511000 | 
响应数据
{
  "type": "DATA",
  "data": {
    "txid": "469df6790f08785a33108620f73aeadd6d0e8344ada1c61c56dc25c35a22d100",
    "time": 1586602009727723000
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 hash | 
订阅实时交易详情
订阅实时交易详情,推送正在发生的全量交易的及其详细的信息(包括生交易以及解析过的交易数据)。
HTTP 请求
curl --location --request GET 'https://api.metasv.com/v1/stream/tx/detail'
GET /stream/tx/detail
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 重放标签(需要重放推送的时间点),纳秒时间戳 1586600513456511000 | 
响应数据
{
  "type": "DATA",
  "data": {
    "tx": {
      "txDetail": {
        "txid": "443ce7b5cfaaf34d650763e7814b7f1b2171313a1d28eb7245434c5c81e3c8d5",
        "version": 1,
        "lockTime": 0,
        "size": 335,
        "fee": 84,
        "inputCount": 1,
        "outputCount": 2,
        "rawHex": "0100000001a3054761ea1ccb63d88a4fadb3e8c307c209ecd8d44963cc86713aac5730f1b5010000006b483045022100914b85024e0aeb275a42dbd64524363905b4fc68f3cfc210fb547c1bdcf7b51902205c133c2ea2d8a44cac6d0e413aa7ee8d55ed945f6e104a9c9acd621b41793c424121036609449580213f50abc68433cf9bed24568b3f6e8dcf19bddfb3e9ee1c6aef5dffffffff02000000000000000086006a22314c74794d45366235416e4d6f70517242504c6b3446474e3855427568784b71726e0101307b2274223a33372c2268223a34322c2270223a313030392c2263223a34302c227773223a332e312c227764223a39307d22313338523356484147456576554c57487173705077716e714a7941344778505479320a31353836363033383234e7ee0000000000001976a91417573bb918cdd72760f6aa59133719119f16769388ac00000000"
      },
      "vinList": [
        {
          "txId": "443ce7b5cfaaf34d650763e7814b7f1b2171313a1d28eb7245434c5c81e3c8d5",
          "index": 0,
          "utxoTxid": "b5f13057ac3a7186cc6349d4d8ec09c207c3e8b3ad4f8ad863cb1cea614705a3",
          "utxoIndex": "1",
          "value": 61243,
          "address": "138R3VHAGEevULWHqspPwqnqJyA4GxPTy2",
          "unlockScript": "483045022100914b85024e0aeb275a42dbd64524363905b4fc68f3cfc210fb547c1bdcf7b51902205c133c2ea2d8a44cac6d0e413aa7ee8d55ed945f6e104a9c9acd621b41793c424121036609449580213f50abc68433cf9bed24568b3f6e8dcf19bddfb3e9ee1c6aef5d",
          "sequence": 4294967295
        }
      ],
      "voutList": [
        {
          "index": 0,
          "value": 0,
          "address": "",
          "lockScript": "006a22314c74794d45366235416e4d6f70517242504c6b3446474e3855427568784b71726e0101307b2274223a33372c2268223a34322c2270223a313030392c2263223a34302c227773223a332e312c227764223a39307d22313338523356484147456576554c57487173705077716e714a7941344778505479320a31353836363033383234",
          "parts": [
            "0",
            "OP_RETURN",
            "1LtyME6b5AnMopQrBPLk4FGN8UBuhxKqrn",
            "\u0001",
            "{\"t\":37,\"h\":42,\"p\":1009,\"c\":40,\"ws\":3.1,\"wd\":90}",
            "138R3VHAGEevULWHqspPwqnqJyA4GxPTy2",
            "1586603824"
          ]
        },
        {
          "index": 1,
          "value": 61159,
          "address": "138R3VHAGEevULWHqspPwqnqJyA4GxPTy2",
          "lockScript": "76a91417573bb918cdd72760f6aa59133719119f16769388ac"
        }
      ]
    },
    "time": 1586603836631453000
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txDetail | Object | 交易概况对象,包含交易的一些汇总信息以及生交易原文 | 
| vinList | List | 
交易输入列表,以及此输入对应的金额、脚本以及 utxo point,以及 input 地址 | 
| voutList | List | 
交易输出列表,以及此输出对应的金额、脚本以及地址(OP_RETURN 会携带 parts) | 
订阅地址
订阅指定地址,实时推送此地址发生的转账事件,包括收款和付款都会推送。
HTTP 请求
curl --location --request GET 'https://api.metasv.com/v1/stream/address/1Twetcht1cTUxpdDoX5HQRpoXeuupAdyf'
GET /stream/address/{address}
请求数据
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | long | false | 重放标签(需要重放推送的时间点),纳秒时间戳 1586600513456511000 | 
| simple | boolean | false | 是否为简单查询(默认为true) | 
响应数据
{
  "type": "DATA",
  "data": {
    "relatedTx": {
      "txDetail": {
        "txid": "e29a8c21a2b7ff6dec2622b8b525bf35f81ace023f5b39f3f627c05f00a7c522",
        "version": 1,
        "lockTime": 0,
        "size": 874,
        "fee": 505,
        "inputCount": 1,
        "outputCount": 6,
        "rawHex": "0100000001e3565a467f8adad66f2f00bea3b8bcec8ed01cd2422d5ac63c9632a0ff69279f050000006a473044022049385c71854122c2f04c00c5b2e517a3acb56bef58548ea5b388ccf0c88ee6ca022020d83cfefafafa9fc68c4abe901ddf5763cab9b219f940e92b56272cb373bec7412103e9ae85c03f284bf044708d1161987be21c54b7879408c367f6ada013316ec677ffffffff060000000000000000fd1802006a2231394878696756345179427633744870515663554551797131707a5a56646f4175741c4e4f20696e206d7920696e746572707265746174696f6e2e2e2e2e2e0a746578742f706c61696e04746578741f7477657463685f7477746578745f313538363630333539303432372e747874017c223150755161374b36324d694b43747373534c4b79316b683536575755374d74555235035345540b7477646174615f6a736f6e046e756c6c0375726c046e756c6c07636f6d6d656e74046e756c6c076d625f75736572053135313337057265706c794063333139356236373137393165303537356639313263393763373563333838633338633336653632383332326332636664313732363036353430663764626333047479706504706f73740974696d657374616d70046e756c6c036170700674776574636807696e766f6963652435313838303130382d353366342d346366372d623863342d653861663566343864313465017c22313550636948473232534e4c514a584d6f53556157566937575371633768436676610d424954434f494e5f454344534122314b6e695a4b396453757354545137564a726142445177537550664d56644d4e776d4c58487741334f376466465738554f3631434e49746a68767679544e4f63494e5946655166626d454d483652564d53335264586d7055304d2f495162415033467a557431755a734f7659356955573571704636366d2f7073773d13130000000000001976a91405186ff0710ed004229e644c0653b2985c648a2388ac22020000000000001976a91471818c0c2fd07d43fce35b1086904ac6838d484388ac990a0000000000001976a9141e32c13d76b7a0c842e69dbc74d1fefc27aab46288ac990a0000000000001976a9148d7795663206e5fb98ca370acb50f63d88bc747588ac35630200000000001976a9148468450fb7f945c6bdc272e22fdcf35c49d4e65e88ac00000000"
      },
      "vinList": [
        {
          "txId": "e29a8c21a2b7ff6dec2622b8b525bf35f81ace023f5b39f3f627c05f00a7c522",
          "index": 0,
          "utxoTxid": "9f2769ffa032963cc65a2d42d21cd08eecbcb8a3be002f6fd6da8a7f465a56e3",
          "utxoIndex": "5",
          "value": 167829,
          "address": "1D5777WrAhk3PuN63U2TTPLys2T7MYmJ21",
          "unlockScript": "473044022049385c71854122c2f04c00c5b2e517a3acb56bef58548ea5b388ccf0c88ee6ca022020d83cfefafafa9fc68c4abe901ddf5763cab9b219f940e92b56272cb373bec7412103e9ae85c03f284bf044708d1161987be21c54b7879408c367f6ada013316ec677",
          "sequence": 4294967295
        }
      ],
      "voutList": [
        {
          "index": 0,
          "value": 0,
          "address": "",
          "lockScript": "006a2231394878696756345179427633744870515663554551797131707a5a56646f4175741c4e4f20696e206d7920696e746572707265746174696f6e2e2e2e2e2e0a746578742f706c61696e04746578741f7477657463685f7477746578745f313538363630333539303432372e747874017c223150755161374b36324d694b43747373534c4b79316b683536575755374d74555235035345540b7477646174615f6a736f6e046e756c6c0375726c046e756c6c07636f6d6d656e74046e756c6c076d625f75736572053135313337057265706c794063333139356236373137393165303537356639313263393763373563333838633338633336653632383332326332636664313732363036353430663764626333047479706504706f73740974696d657374616d70046e756c6c036170700674776574636807696e766f6963652435313838303130382d353366342d346366372d623863342d653861663566343864313465017c22313550636948473232534e4c514a584d6f53556157566937575371633768436676610d424954434f494e5f454344534122314b6e695a4b396453757354545137564a726142445177537550664d56644d4e776d4c58487741334f376466465738554f3631434e49746a68767679544e4f63494e5946655166626d454d483652564d53335264586d7055304d2f495162415033467a557431755a734f7659356955573571704636366d2f7073773d",
          "parts": [
            "0",
            "OP_RETURN",
            "19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut",
            "NO in my interpretation.....",
            "text/plain",
            "text",
            "twetch_twtext_1586603590427.txt",
            "|",
            "1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5",
            "SET",
            "twdata_json",
            "null",
            "url",
            "null",
            "comment",
            "null",
            "mb_user",
            "15137",
            "reply",
            "c3195b671791e0575f912c97c75c388c38c36e628322c2cfd172606540f7dbc3",
            "type",
            "post",
            "timestamp",
            "null",
            "app",
            "twetch",
            "invoice",
            "51880108-53f4-4cf7-b8c4-e8af5f48d14e",
            "|",
            "15PciHG22SNLQJXMoSUaWVi7WSqc7hCfva",
            "BITCOIN_ECDSA",
            "1KniZK9dSusTTQ7VJraBDQwSuPfMVdMNwm",
            "HwA3O7dfFW8UO61CNItjhvvyTNOcINYFeQfbmEMH6RVMS3RdXmpU0M/IQbAP3FzUt1uZsOvY5iUW5qpF66m/psw="
          ]
        },
        {
          "index": 1,
          "value": 4883,
          "address": "qqz3smlswy8dqppznejycpjnk2v9cey2yvgehq93cw",
          "lockScript": "76a91405186ff0710ed004229e644c0653b2985c648a2388ac"
        },
        {
          "index": 2,
          "value": 546,
          "address": "qpccrrqv9lg86sluudd3pp5sftrg8r2ggvzlx9zjhx",
          "lockScript": "76a91471818c0c2fd07d43fce35b1086904ac6838d484388ac"
        },
        {
          "index": 3,
          "value": 2713,
          "address": "qq0r9sfaw6m6pjzzu6wmcax3lm7z0245vgruw3r85n",
          "lockScript": "76a9141e32c13d76b7a0c842e69dbc74d1fefc27aab46288ac"
        },
        {
          "index": 4,
          "value": 2713,
          "address": "qzxh09txxgrwt7ucegms4j6s7c7c30r5w5a3t5m3c7",
          "lockScript": "76a9148d7795663206e5fb98ca370acb50f63d88bc747588ac"
        },
        {
          "index": 5,
          "value": 156469,
          "address": "qzzxs3g0klu5t34acfewyt7u7dwyn48xtcyj22ssqq",
          "lockScript": "76a9148468450fb7f945c6bdc272e22fdcf35c49d4e65e88ac"
        }
      ]
    },
    "time": 1586603609082965000,
    "income": 4883,
    "outcome": 0
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| relatedTx | Object | 与此地址相关的交易详情,数据结构同上面的订阅交易详情 | 
| income | Long | 此地址在此次交易总收入(所有 output 之和) | 
| outcome | Long | 此地址在此次交易总支出(所有 input 之和) | 
简单查询响应数据
{
  "type": "DATA",
  "data": {
    "txid": "8f8c2a7f89ccc0b6b4f70d0e126e158dfa3174f640a7698ad9f4996778af47d2",
    "time": 1586865907728955000,
    "income": 546,
    "outCome": 0
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 id | 
| income | Long | 此地址在此次交易总收入(所有 output 之和) | 
| outcome | Long | 此地址在此次交易总支出(所有 input 之和) | 
订阅实时链上数据
订阅带有 OP_RETURN 的交易,同时根据 OP_RETURN 来筛选链上数据。
HTTP 请求
curl --location --request GET 'https://api.metasv.com/v1/stream/data?p2=1LtyME6b5AnMopQrBPLk4FGN8UBuhxKqrn'
GET /stream/data
请求数据
| 操作码 | 栈的位置 | 代号 | 
|---|---|---|
| OP_FALSE | 0 | p0 | 
| OP_RETURN | 1 | p1 | 
| data0 | 2 | p2 | 
| data1 | 3 | p3 | 
| data2 | 4 | p4 | 
| data3 | 5 | p5 | 
| data4 | 6 | p6 | 
根据上述代号传递参数,参数起到 filter 的作用,要求交易必须满足参数才会被推送。
| 参数 | 数据类型 | 是否必需 | 描述 | 
|---|---|---|---|
| flag | string | false | 重放标签(需要重放推送的时间点),纳秒时间戳 1586600513456511000 | 
| inputAddress | string | false | 交易中的 input 必须包含此地址(用于鉴权和区分身份) | 
| p2 | string | false | OP_RETURN 栈中 p2 的位置匹配此字符,一般为 bitcom 协议 protocol | 
| p3 | string | false | OP_RETURN 栈中 p3 的位置匹配此字符 | 
| p4 | string | false | OP_RETURN 栈中 p4 的位置匹配此字符 | 
| p5 | string | false | OP_RETURN 栈中 p5 的位置匹配此字符 | 
| p6 | string | false | OP_RETURN 栈中 p6 的位置匹配此字符 | 
响应数据
{
  "type": "DATA",
  "data": {
    "data": {
      "txId": "b727685b857824ff050d8b9c485c214aedd284f13e422223cd7d30093f0dfa18",
      "raw": "006a22314c74794d45366235416e4d6f70517242504c6b3446474e3855427568784b71726e01012b7b2274223a32302e30362c2268223a34302c2270223a313032332c2263223a32302c227773223a312e357d2231473256686f434e73596651487a5044313256506b357037584876413572745874500a31353836363035303631",
      "parts": [
        "0",
        "OP_RETURN",
        "1LtyME6b5AnMopQrBPLk4FGN8UBuhxKqrn",
        "\u0001",
        "{\"t\":20.06,\"h\":40,\"p\":1023,\"c\":20,\"ws\":1.5}",
        "1G2VhoCNsYfQHzPD12VPk5p7XHvA5rtXtP",
        "1586605061"
      ]
    },
    "time": 1586605064152232000
  }
}
| 字段 | 数据类型 | 描述 | 
|---|---|---|
| txid | string | 交易 hash | 
| raw | string | 此 OP_RETURN 的 output 的 HEX 表示 | 
| parts | string | utf8 解析后的输出栈内容 parts | 
事件触发器
MetaSV 提供一些事件触发器(Transaction Event Trigger)服务,只要向指定地址发送指定格式的交易,就可以触发特定的链上事件发生。
此类服务无需 http 和 rest 请求,只需要构造比特币交易,只要此交易满足特定的条件,就可以触发服务。
加特林机枪
为了给开发者以及其他商家提供测试便利的需要,MetaSV 推出了简单易用的交易机枪功能。
由于短期之内发送大量交易是非常复杂的,需要提前拆分 UTXO,并且管理 UTXO 并发问题,同时还有交易签名和广播的性能瓶颈。
MetaSV 将为应用方封闭所有的内部复杂性,只需要一个简单的交易即可高速发射交易。
使用方法
向以下地址转账超过 2000satoshi,即可触发 0.25 费率机枪。
1MpRcaGTx3iQ5EisGbfPa2jTWUPTQ5jqWZ
向以下地址转账超过 2000satoshi,即可触发 0.5 费率机枪。
1EHpcD2vyh7vwaYtFELthqoGXAS3iSfUTL
如果想在机枪生成的交易中写入个性签名,可以在转账交易的 OP_RETURN 中写入,例如:
0 OP_RETURN LoveBSV
那么在所有的机枪交易中都会输出一个这样的 OP_RETURN。如果不指定个性签名的话,将显示 MetaSV.com。
限制
一次转账触发的机枪将以固定的 10TPS 的速度进行发射。
系统同时执行的任务数量为 20 个(最高 200TPS),超过则需要排队等待执行。
查看结果
可以从一些实时交易显示网站,如BitcoinBlocks.live来查看实时效果。
也可以使用 MetaStream 来监控查询机枪的交易,例如: https://api.metasv.com/v1/stream/data?p3=7a2591 其中,p3 位 part 3 的位置,机枪会在此处写入触发此任务的交易 hash 的前 6 位作为任务 Id,用来搜索交易。在机枪发射完毕后,也可以使用 MetaSV 的数据查询接口,来查看机枪的发射历史,本例中交易 id 为 7a2591cbe716118ee3773f5584eee13a283f83657cd879cbab271e45e0fd8d7f。
还可以使用我们定制前端页面, https://webot.metasv.com/gatlin/your_order_txid 例如:example link
费用
转账金额至少 2000satoshi,低于 2000 的被视作捐赠,请注意。
单个交易的计费(单位:satoshi)如下公式所示:
0.5费率加特林: 单价 = (个性签名长度 - 10) * 10; 如果前面计算出的单价低于300那么单价取300
0.25费率加特林: 单价 = (个性签名长度 - 5) * 10; 如果前面计算出的单价低于200那么单价等于200
费用包含矿工手续费,构造 utxo 子弹的费用,以及 MetaSV 服务器费用等。
如果有大量交易上链需求,可以联系我们团队,给与优惠的费率。
意见和建议
如果您在使用过程中有任何的意见和建议,欢迎提交 issue 到 github 仓库:
https://github.com/KaKeimei/meta-sv/issues
更新日志
2020 年 6 月 8 日
- 增加地址基本信息和地址交易列表接口。
 
2020 年 6 月 3 日
- 增加区块查询接口。
 
2020 年 5 月 28 日
- utxo 新增后代字段。查询 utxo 时可以看到后代数。
 
2020 年 5 月 27 日
- metanet node 查询新增公钥字段。查询时可使用节点公钥。
 
2020 年 5 月 17 日
- 广播交易之后,将直推矿工,并增加返回矿工签名等信息
 
2020 年 5 月 14 日
- 在商户用接口中增加 Paymail 地址查询服务
 
2020 年 5 月 9 日
- 增加事件触发器的服务
 - 增加加特林机枪服务
 
2020 年 5 月 5 日
- metastream 订阅 block,新增 miner 名称以及 coinbase message
 
2020 年 4 月 17 日
- metanet 节点查询新增 rootTxid,rootAddress 字段
 - 数据列表查询新增时间段参数
 
2020 年 4 月 14 日
实时地址流水流新增简单查询参数
2020 年 4 月 11 日
新增 MetaStream 流式推送接口
订阅实时区块流: /stream/block
订阅实时交易 hash 流: /stream/tx
订阅实时交易详情流: /stream/tx/detail
订阅实时地址流水流: /stream/address/{address}
订阅实时链上数据流: /stream/data
新增获取生交易的接口
- /tx/{txid}/raw
 
修改如下接口,当资源未找到的时候,返回 code 404:
/tx/{txid}
/data/tx/{txid} /data/tx/{txid}/{outputIndex}
2020 年 3 月 27 日
新增两个接口,支持 utxo 操作:
utxo 批量选取接口 /merchants/utxo_select
utxo 翻页查询接口 /address/{address}/utxo
2020 年 3 月 15 日
alpha 版本发布
错误码
汇总目前所有接口可能返回的 Code 错误码与含义:
| 错误码 | 代号 | 说明 | 
|---|---|---|
| 404 | NOT_FOUND | 所请求的资源不存在 | 
| 500 | SYSTEM_ERROR | 系统发生错误 | 
| 20001 | UTXO_SELECT_AMOUNT_INSUFFICIENT | 使用挑选 utxo 接口时,余额不足 |