# XWC交易所钱包适配指南

本章将介绍交易所如何适配XWC

# 系统环境软硬件需求

  • 操作系统:Ubuntu 16.04 LTS64位系统
  • 硬件:内存16GB+ 硬盘可用空间10GB+

交易所及其他中心化应用系统通过rpc方式访问底层钱包

# 如何启动RPC服务端监听

启动Rpc模式

  1. 启动xwc_node --data-dir=$data-dir --rpc-enpoint=$server_ip
  2. 启动xwc_client --wallet-file=$walletname --server-rpc-endpoint=$server_ip --rpc-endpoint=$client_ip
参数 说明
--data-dir 指定xwc启动需要的数据目录
--rpc-endpoint 指定xwc_node和xwc_client rpc监听ip端口
--server-rpc-endpoint 指定xwc_client 需要链接的服务器ip(格式为 “ws://127.0.0.1:8090”)
--wallet-file 指定的钱包文件,不指定则钱包会自动生成

示例:

    xwc_node --data-dir =./data --rpc-endpoint=127.0.0.1:9991
    xwc_client --wallet-file=a.json --server-rpc-endpoint=”ws://127.0.0.1:9991” --rpc-endpoint=”127.0.0.1:9992”

其中--rpc-endpoint 参数127.0.0.1:9992 为用户访问xwc节点的rpc入口

# RPC使用规范

基本规范

所有RPC接口均遵循jsonrpc规范2.0,具体参考文档:https://www.jsonrpc.org/specification (opens new window)

使用方式

所有jsonrpc数据均通过HTTP POST方法传递,结果在HTTP响应中获取。 HTTP请求的URL为xwc_client的rpc监听服务:http://127.0.0.1:9992/ (opens new window)

注意,请不要直接使用xwc_node提供的rpc服务,该服务目前仅对xwc_client内部开放。

消息结构

Jsonrpc的消息由请求和响应分别构成,一一对应。

  • 请求

Jsonrpc请求包括如下结构:

{ 
“jsonrpc” : ”2.0”,
"method" : "info", 
"params" : [], 
"id" : 1
}

jsonrpc” - 协议版本,目前固定为”2.0”

method” – 调用的方法名称,具体参考下面的接口列表

params” – 方法所需要的参数,参考具体接口描述

id” – 请求消息的唯一id,如客户端需要同时并发多个消息,此字段会由服务端原封不动返回,客户端以此来辨别是哪个请求对应的消息响应.

  • 响应

响应包括如下结构:

{
"id": 1,
"jsonrpc": "2.0",
"result": {
"head_block_num": 786742,
"head_block_id": "000c013669c0391fdd12eeacc8d2eafdd56fdd75",
"head_block_age": "5 seconds old",
"next_maintenance_time": "18 hours in the future",
"chain_id": "2e13ba07b457f2e284dcfcbd3d4a3e4d78a6ed89a61006cdb7fdad6d67ef0b12",
"participation": "100.00000000000000000",
"round_participation": "68.00000000000000000",
"scheduled_citizens": ["1.6.168","1.6.146","1.6.31","1.6.42","1.6.15","1.6.86","1.6.44","1.6.4","1.6.27","1.6.160","1.6.65","1.6.84",
"1.6.118","1.6.39","1.6.77","1.6.73","1.6.119","1.6.131","1.6.147","1.6.16","1.6.2","1.6.106","1.6.53","1.6.145",
"1.6.154"]
}
}

id” – 请求消息的唯一id,如客户端需要同时并发多个消息,此字段会由服务端原封不动返回,客户端以此来辨别是哪个请求对应的消息响应

jsonrpc” - 协议版本,目前固定为”2.0”

result” – 调用方法返回的结果,具体参考下面的接口列表

error” – 如果调用方法出错,则会有此字段,正常返回无此字段

HTTP样例

  • 请求

请求结构如下:

POST / HTTP/1.1
Host: 127.0.0.1:9992
Cache-Control: no-cache
{
"id":1,
“jsonrpc":"2.0",
"method":"info",
"params":[]
}
  • 响应

注意,此处省略HTTP头部。

{
"id": 1,
"jsonrpc": "2.0",
"result": {
"head_block_num": 786742,
"head_block_id": "000c013669c0391fdd12eeacc8d2eafdd56fdd75",
"head_block_age": "5 seconds old",
"next_maintenance_time": "18 hours in the future",
"chain_id": "2e13ba07b457f2e284dcfcbd3d4a3e4d78a6ed89a61006cdb7fdad6d67ef0b12",
"participation": "100.00000000000000000",
"round_participation": "68.00000000000000000",
"scheduled_citizens": [
"1.6.168",
"1.6.146",
"1.6.31",
"1.6.42",
"1.6.15",
"1.6.86",
"1.6.44",
"1.6.4",
"1.6.27",
"1.6.160",
"1.6.65",
"1.6.84",
"1.6.118",
"1.6.39",
"1.6.77",
"1.6.73",
"1.6.119",
"1.6.131",
"1.6.147",
"1.6.16",
"1.6.2",
"1.6.106",
"1.6.53",
"1.6.145",
"1.6.154"
]
}
}

curl样例

  • 请求

请求命令如下:

curl -X POST   http://127.0.0.1:9992/   -H 'cache-control: no-cache'   -H 'postman-token: a79b33f6-31a3-ec23-d114-d468f3d71c7c'   -d '{
  "jsonrpc": "2.0",
  "id": 61,
  "method": "info",
  "params": []
}'
  • 响应

响应如下:

{"id":61,
"jsonrpc":"2.0",
"result":
{"head_block_num":787040,
"head_block_id":"000c0260fb7dc04a7a6a1781ec54753cc9d536f4",
"head_block_age":"3 seconds old",
"next_maintenance_time":"18 hours in the future",
"chain_id":"2e13ba07b457f2e284dcfcbd3d4a3e4d78a6ed89a61006cdb7fdad6d67ef0b12",
"participation":"100.00000000000000000",
"round_participation":"64.00000000000000000",
"scheduled_citizens":["1.6.42","1.6.39","1.6.143","1.6.150","1.6.156","1.6.30","1.6.65","1.6.125","1.6.131","1.6.34","1.6.33","1.6.4","1.6.47","1.6.94","1.6.165","1.6.109","1.6.107","1.6.12","1.6.104","1.6.115","1.6.86","1.6.36","1.6.161","1.6.106","1.6.53"]}}

# 基本操作指令

获取客户端信息

Request

{"method":"info","id":20180523092052345,"jsonrpc":"2.0","params":[]}

response成功

{
    "id": "20180523092052345",
    "result": {
    "head_block_num": 634505,
    "head_block_id": "0009ae8941db944c1d2ec63cf64be2bd6b79b695",
    "head_block_age": "1 second old",
    "next_maintenance_time": "21 hours in the future",
    "chain_id": "2e13ba07b457f2e284dcfcbd3d4a3e4d78a6ed89a61006cdb7fdad6d67ef0b12",
    "participation": "98.43750000000000000",
    "round_participation": "24.00000000000000000",
    "scheduled_citizens": ["1.6.63", "1.6.33", "1.6.66", "1.6.95", "1.6.86", "1.6.112", "1.6.42", "1.6.54", "1.6.8", "1.6.52", "1.6.97", "1.6.123", "1.6.38", "1.6.139", "1.6.124", "1.6.31", "1.6.146", "1.6.115", "1.6.93", "1.6.4", "1.6.137", "1.6.53", "1.6.84", "1.6.27", "1.6.109"]
}
}

返回参数:

" head_block_num ": 区块号,

" head_block_age ": 当前最大块的产生的时长,

" next_maintenance_time ": "下一次链上maintenance时间",

" head_block_id ": "当前块ID",

" chain_id ": "链ID",

" participation ": 当前链上参与率,

" round_participation ": "当前轮参与率",

" scheduled_citizens ":当前出块的citizen

查询链上参数(手续费等)

request

{"method":"get_global_properties","id":20180523092052345,"jsonrpc":"2.0","params":[]}

response

{
    "id": "2.0.0",
    "parameters": {
        "current_fees": {
            "parameters": [
                [0, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [1, {
                    "fee": 50
                }],
                [2, {
                    "fee": 0
                }],
                [3, {
                    "fee": 100
                }],
                [4, {
                    "fee": 0
                }],
                [5, {
                    "basic_fee": 500000,
                    "premium_fee": 20000,
                    "price_per_kbyte": 10
                }],
                [6, {
                    "fee": 100,
                    "price_per_kbyte": 10
                }],
                [7, {
                    "fee": 300000
                }],
                [8, {
                    "membership_annual_fee": 20000,
                    "membership_lifetime_fee": 100000
                }],
                [9, {
                    "fee": 5000
                }],
                [10, {
                    "fee": 5000
                }],
                [11, {
                    "fee": 100
                }],
                [12, {
                    "fee": 5000
                }],
                [13, {
                    "symbol3": 5000000,
                    "symbol4": 3000000,
                    "long_symbol": 50000,
                    "price_per_kbyte": 10
                }],
                [14, {
                    "fee": 5000,
                    "price_per_kbyte": 10
                }],
                [15, {
                    "fee": 5000
                }],
                [16, {
                    "fee": 5000
                }],
                [17, {
                    "fee": 100,
                    "price_per_kbyte": 10
                }],
                [18, {
                    "fee": 100
                }],
                [19, {
                    "fee": 10
                }],
                [20, {
                    "fee": 1000
                }],
                [21, {
                    "fee": 5000
                }],
                [22, {
                    "fee": 10
                }],
                [23, {
                    "fee": 10
                }],
                [24, {
                    "fee": 100000000
                }],
                [25, {
                    "fee": 100
                }],
                [26, {
                    "fee": 0
                }],
                [27, {
                    "fee": 0
                }],
                [28, {
                    "fee": 100,
                    "price_per_kbyte": 10
                }],
                [29, {
                    "fee": 100,
                    "price_per_kbyte": 10
                }],
                [30, {
                    "fee": 10
                }],
                [31, {
                    "fee": 10
                }],
                [32, {
                    "fee": 10
                }],
                [33, {
                    "fee": 200,
                    "price_per_kbyte": 10
                }],
                [34, {
                    "fee": 0
                }],
                [35, {
                    "fee": 1000000000
                }],
                [36, {
                    "fee": 100
                }],
                [37, {
                    "fee": 10
                }],
                [38, {
                    "fee": 35000
                }],
                [39, {
                    "fee": 10
                }],
                [40, {
                    "fee": 200
                }],
                [41, {
                    "fee": 45000
                }],
                [42, {
                    "fee": 10,
                    "price_per_kbyte": 10
                }],
                [43, {
                    "fee": 10
                }],
                [44, {}],
                [45, {
                    "fee": 100,
                    "price_per_kbyte": 10
                }],
                [46, {
                    "fee": 100
                }],
                [47, {
                    "fee": 100
                }],
                [48, {
                    "fee": 50,
                    "price_per_output": 50
                }],
                [49, {
                    "fee": 50,
                    "price_per_output": 50
                }],
                [50, {
                    "fee": 50
                }],
                [51, {}],
                [52, {
                    "fee": 100
                }],
                [53, {}],
                [54, {
                    "fee": 10
                }],
                [55, {
                    "fee": 100
                }],
                [56, {
                    "fee": 100
                }],
                [57, {
                    "fee": 100
                }],
                [58, {
                    "fee": 100
                }],
                [59, {
                    "fee": 100
                }],
                [60, {
                    "fee": 100
                }],
                [61, {
                    "fee": 100
                }],
                [62, {
                    "fee": 100
                }],
                [63, {
                    "fee": 100
                }],
                [64, {
                    "fee": 100
                }],
                [65, {
                    "fee": 100
                }],
                [66, {
                    "fee": 100
                }],
                [67, {
                    "fee": 100
                }],
                [68, {
                    "fee": 100
                }],
                [69, {
                    "fee": 100
                }],
                [70, {
                    "fee": 100
                }],
                [71, {
                    "fee": 100
                }],
                [72, {
                    "fee": 100
                }],
                [73, {
                    "fee": 100
                }],
                [74, {
                    "fee": 100
                }],
                [75, {
                    "fee": 100
                }],
                [76, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [77, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [78, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [79, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [80, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [81, {
                    "fee": 100,
                    "price_per_kbyte": 100
                }],
                [82, {
                    "fee": 100
                }],
                [83, {
                    "fee": 100
                }],
                [84, {
                    "fee": 100
                }],
                [85, {
                    "fee": 100
                }],
                [86, {
                    "fee": 100
                }],
                [87, {
                    "fee": 100
                }],
                [88, {
                    "fee": 100
                }],
                [89, {
                    "fee": 100
                }],
                [90, {
                    "fee": 100
                }],
                [91, {
                    "fee": 100
                }],
                [92, {
                    "fee": 5000
                }],
                [93, {
                    "fee": 100
                }],
                [94, {
                    "fee": 100
                }],
                [95, {
                    "fee": 100
                }],
                [96, {
                    "fee": 100
                }],
                [97, {
                    "fee": 100
                }],
                [98, {
                    "fee": 100
                }],
                [99, {
                    "fee": 100
                }],
                [100, {
                    "fee": 100
                }],
                [101, {
                    "fee": 100000000
                }],
                [102, {
                    "fee": 100
                }],
                [103, {
                    "fee": 100
                }],
                [104, {
                    "fee": 100
                }],
                [105, {
                    "fee": 100
                }],
                [106, {
                    "fee": 100
                }],
                [107, {
                    "fee": 100
                }],
                [108, {
                    "fee": 100
                }],
                [109, {
                    "fee": 100
                }],
                [110, {
                    "fee": 100
                }],
                [111, {
                    "fee": 100
                }],
                [112, {
                    "fee": 100
                }]
            ],
            "scale": 10000
        },
        "block_interval": 5,
        "maintenance_interval": 86400,
        "maintenance_skip_slots": 3,
        "committee_proposal_review_period": 1209600,
        "maximum_transaction_size": 2048,
        "maximum_block_size": 2048000000,
        "maximum_time_until_expiration": 86400,
        "maximum_proposal_lifetime": 2419200,
        "maximum_asset_whitelist_authorities": 10,
        "maximum_asset_feed_publishers": 10,
        "maximum_miner_count": 1001,
        "maximum_guard_count": 15,
        "minimum_guard_count": 7,
        "maximum_authority_membership": 10,
        "reserve_percent_of_fee": 2000,
        "network_percent_of_fee": 2000,
        "lifetime_referrer_percent_of_fee": 3000,
        "cashback_vesting_period_seconds": 31536000,
        "cashback_vesting_threshold": 10000,
        "count_non_member_votes": true,
        "allow_non_member_whitelists": false,
        "miner_pay_per_block": 1000,
        "worker_budget_per_day": 50000000,
        "max_predicate_opcode": 1,
        "fee_liquidation_threshold": 10000,
        "accounts_per_fee_scale": 1000,
        "account_fee_scale_bitshifts": 4,
        "max_authority_depth": 2,
        "min_pay_back_balance": 100,
        "min_pay_back_balance_other_asset": [],
        "extensions": []
    },
    "next_available_vote_id": 217,
    "active_committee_members": ["1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.5.4", "1.5.5", "1.5.6", "1.5.7", "1.5.8", "1.5.9", "1.5.10", "1.5.11", "1.5.12", "1.5.13", "1.5.14"],
    "active_witnesses": ["1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.6.5", "1.6.6", "1.6.7", "1.6.8", "1.6.9", "1.6.10", "1.6.11", "1.6.12", "1.6.13", "1.6.14", "1.6.15", "1.6.16", "1.6.17", "1.6.18", "1.6.19", "1.6.20", "1.6.21", "1.6.22", "1.6.23", "1.6.24", "1.6.25", "1.6.26", "1.6.27", "1.6.28", "1.6.29", "1.6.30", "1.6.31", "1.6.32", "1.6.33", "1.6.34", "1.6.35", "1.6.36", "1.6.37", "1.6.38", "1.6.39", "1.6.40", "1.6.41", "1.6.42", "1.6.43", "1.6.44", "1.6.45", "1.6.46", "1.6.47", "1.6.48", "1.6.49", "1.6.50", "1.6.51", "1.6.52", "1.6.53", "1.6.54", "1.6.55", "1.6.56", "1.6.57", "1.6.58", "1.6.59", "1.6.60", "1.6.61", "1.6.62", "1.6.63", "1.6.64", "1.6.65", "1.6.66", "1.6.67", "1.6.68", "1.6.69", "1.6.70", "1.6.71", "1.6.72", "1.6.73", "1.6.74", "1.6.75", "1.6.76", "1.6.77", "1.6.78", "1.6.79", "1.6.80", "1.6.81", "1.6.82", "1.6.83", "1.6.84", "1.6.85", "1.6.86", "1.6.87", "1.6.88", "1.6.89", "1.6.90", "1.6.91", "1.6.92", "1.6.93", "1.6.94", "1.6.95", "1.6.96", "1.6.97", "1.6.98", "1.6.99", "1.6.100", "1.6.101", "1.6.102", "1.6.103", "1.6.104", "1.6.105", "1.6.106", "1.6.107", "1.6.108", "1.6.109", "1.6.110", "1.6.111", "1.6.112", "1.6.113", "1.6.114", "1.6.115", "1.6.116", "1.6.117", "1.6.118", "1.6.119", "1.6.120", "1.6.121", "1.6.122", "1.6.123", "1.6.124", "1.6.125", "1.6.126", "1.6.127", "1.6.128", "1.6.129", "1.6.130", "1.6.131", "1.6.132", "1.6.133", "1.6.134", "1.6.135", "1.6.136", "1.6.137", "1.6.138", "1.6.139", "1.6.140", "1.6.141", "1.6.142", "1.6.143", "1.6.144", "1.6.145", "1.6.146", "1.6.147", "1.6.148", "1.6.149", "1.6.150", "1.6.151", "1.6.152", "1.6.153", "1.6.154", "1.6.155", "1.6.156", "1.6.157", "1.6.158", "1.6.159", "1.6.160", "1.6.161", "1.6.162", "1.6.163", "1.6.164", "1.6.165", "1.6.166", "1.6.167", "1.6.168", "1.6.169", "1.6.170", "1.6.171", "1.6.172", "1.6.173", "1.6.174", "1.6.175", "1.6.176", "1.6.177", "1.6.178", "1.6.179", "1.6.180", "1.6.181", "1.6.182", "1.6.183", "1.6.184", "1.6.185", "1.6.186", "1.6.187", "1.6.188", "1.6.189", "1.6.190", "1.6.191", "1.6.192", "1.6.193", "1.6.194", "1.6.195", "1.6.196", "1.6.197", "1.6.198", "1.6.199"],
    "unorder_blocks_match": [
        [6307200, 2700000],
        [12614400, 2500000],
        [18921600, 2400000],
        [25228800, 2200000],
        [31536000, 2100000],
        [37843200, 1900000],
        [44150400, 1700000],
        [4294967295, 200000]
    ]
}

参数解释:

“current_fees”对象下的手续费按照类型不同分别计算,其中比较常用的是类型为60的转账交易。其中转账备注是按照长度收费,每1KB收0.001XWC。

创建钱包

调用前提:钱包不存在 注:成功创建钱包后,钱包默认是关闭的,。 请求方法:set_password 请求参数:创建密码(长度不低于8位)

request

{"method":"set_password","id":20180517140651383,"jsonrpc":"2.0","params":["12345678"]}

response

{"id":"20180517140651383","result":null}

解锁钱包

调用前提:钱包存在 请求方法:unlock 请求参数:密码

request

{"method":"unlock","id":20180517142746758,"jsonrpc":"2.0","params":["12345678"]}

response

{"id":"20180517142746758","result":null}

创建账户

调用前提:钱包解锁

请求方法:wallet _create_account请求参数:待创建的用户名(小写英文字符开头、只能是小写英文字符、数字或中划线)

request

{"method":"wallet _create_account","id":20180517144818773,"jsonrpc":"2.0","params":["test"]}

response

{"id":"20180517144818773","result":"XWCNgycDeX4xna8w6cchoudZanQ8ssT9mriXh"}

result: 创建账户地址

查询账户信息

请求方法: get_account 请求参数: 账户名

request

{"method":"get_account","id":20180517144818773,"jsonrpc":"2.0","params":["hyper-exchange"]}

response

{"id":"20180517144818773","result": {
    "id": "1.2.229",
    "membership_expiration_date": "1970-01-01T00:00:00",
    "registrar": "1.2.0",
    "referrer": "1.2.0",
    "lifetime_referrer": "1.2.0",
    "network_fee_percentage": 2000,
    "lifetime_referrer_fee_percentage": 3000,
    "referrer_rewards_percentage": 0,
    "name": "hyper-exchange",
    "addr": "XWCNRGtrNXR5RD9rUxFQGr6o8D6Q6zm2zGvGJ",
    "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
            ["XWC6L9qtB2hMFVAmc9NowwHYiwkTSeemqK1RbytTG7uSP96uZd35t", 1]
        ],
        "address_auths": []
    },
    "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
            ["XWC6L9qtB2hMFVAmc9NowwHYiwkTSeemqK1RbytTG7uSP96uZd35t", 1]
        ],
        "address_auths": []
    },
    "options": {
        "memo_key": "XWC6L9qtB2hMFVAmc9NowwHYiwkTSeemqK1RbytTG7uSP96uZd35t",
        "voting_account": "1.2.5",
        "num_witness": 0,
        "num_committee": 0,
        "votes": [],
        "miner_pledge_pay_back": 10,
        "extensions": []
    },
    "statistics": "2.9.229",
    "whitelisting_accounts": [],
    "blacklisting_accounts": [],
    "whitelisted_accounts": [],
    "blacklisted_accounts": [],
    "owner_special_authority": [0, {}],
    "active_special_authority": [0, {}],
    "top_n_control_flags": 0,
    "online": "true"
} }

result: 账户详细信息

4.7 查询钱包内账户的地址

请求方法:get_account_balances 请求参数:账户名

request

{"method":"get_account_balances","id":20180517150216550,"jsonrpc":"2.0","params":["test"]}

reponse

{"id":"20180517150216550", "result": [{
    "amount": 16452,
    "asset_id": "1.3.0"
}, {
    "amount": 0,
    "asset_id": "1.3.3"
}] }

返回结果中,amount 为不带精度的余额 asset_id 为资产id

根据地址查询余额

请求方法:get_addr_balances 请求参数:xwc地址

request

{"method":"get_addr_balances","id":20180517150216550,"jsonrpc":"2.0","params":[" XWCNQoBQ6xLLRY5NvhjFX2UbessNAbP4E1LXm"]}

response

{"id":"20180517150216550", "result": [{
    "amount": 16452,
    "asset_id": "1.3.0"
}, {
    "amount": 0,
    "asset_id": "1.3.3"
}] }

账户转账

调用前提:钱包解锁,钱包内有账户 请求方法: transfer_to_address 请求参数:取钱账户、 转账到账户的地址、转账金额、 转账资产类型(XWC)、备注信息,是否广播

request

{"method":"transfer_to_address","id":20180517150833029,"jsonrpc":"2.0",
"params":["test","XWCNQoBQ6xLLRY5NvhjFX2UbessNAbP4E1LXm","23",XWC,”hello world”,true]
}

response

{
    "id": "20180517150833029",
    "result": {
    "ref_block_num": 47371,
    "ref_block_prefix": 1886805367,
    "expiration": "2018-12-25T07:05:20",
    "operations": [
        [0, {
            "fee": {
                "amount": 100,
                "asset_id": "1.3.0"
            },
            "from": "1.2.0",
            "to": "1.2.0",
            "from_addr": "XWCNQ3vUe95it1pXVqjuUhMBPMf9B5mSLjBzR",
            "to_addr": "XWCNRGtrNXR5RD9rUxFQGr6o8D6Q6zm2zGvGJ",
            "amount": {
                "amount": 40311,
                "asset_id": "1.3.0"
            },
            "memo": {
                "from": "XWC1111111111111111111111111111111114T1Anm",
                "to": "XWC1111111111111111111111111111111114T1Anm",
                "nonce": 0,
                "message": "0000000068656c6c6f"
            },
            "extensions": []
        }]
    ],
    "extensions": [],
    "signatures": ["1f0a02c4cee5146a47ec3a9fedcbc30543bac531351d0c8acf66151c4da445f985167616005ef0c34dcade32ff3750ee3322516e71870ec870f56f9cc53b2415ff"],
    "block_num": 0,
    "trxid": "34f1bf431281f2f62abb54bb98a36dd954495ef0"
}
}

返回参数:

trx_id: 交易单号(重要)

block_num: 块号(交易打包后会正式写入)

is_virtual: 保留字段

operations: 结构体类型名

交易记录查询

调用前提:钱包打开 请求方法:get_transaction 请求参数 : 交易id

request

{"method":"get_transaction","id":20180517153307898,"jsonrpc":"2.0",
"params":[“94711706fd82c84f3961136ba44d5dc251b8abb1”]}

response

{
    "id": "20180517150833029",
    "result": {
    "ref_block_num": 47371,
    "ref_block_prefix": 1886805367,
    "expiration": "2018-12-25T07:05:20",
    "operations": [
        [0, {
            "fee": {
                "amount": 100,
                "asset_id": "1.3.0"
            },
            "from": "1.2.0",
            "to": "1.2.0",
            "from_addr": "XWCNQ3vUe95it1pXVqjuUhMBPMf9B5mSLjBzR",
            "to_addr": "XWCNRGtrNXR5RD9rUxFQGr6o8D6Q6zm2zGvGJ",
            "amount": {
                "amount": 40311,
                "asset_id": "1.3.0"
            },
            "memo": {
                "from": "XWC1111111111111111111111111111111114T1Anm",
                "to": "XWC1111111111111111111111111111111114T1Anm",
                "nonce": 0,
                "message": "hello"
            },
            "extensions": []
        }]
    ],
    "extensions": [],
    "signatures": ["1f0a02c4cee5146a47ec3a9fedcbc30543bac531351d0c8acf66151c4da445f985167616005ef0c34dcade32ff3750ee3322516e71870ec870f56f9cc53b2415ff"],
    "block_num": 637196,
    "trxid": "34f1bf431281f2f62abb54bb98a36dd954495ef0"
}
}

返回参数:

id: 交易单号

block_num: 块号(链上确认之后,块号将不为0)

operations:交易op信息,其中红色数字为op类型

fee:手续费信息

若交易id没有被确认,则该命令无法查询到任何信息

# 轻钱包rpc接口

获取链上refinfo信息

请求方法:lightwallet_get_refblock_info 请求参数:无

request

{
  "jsonrpc":"2.0",
  "id":1,
  "method":"lightwallet_get_refblock_info",
  "params":[]
}

response

{
"id": 1,
"result": "11398,47706285"
}

返回参数:

result中返回的字符串即为refinfo

广播交易

请求方法:lightwallet_broadcast 请求参数:需广播的交易(格式化为一行的json字符串)

request

{
  "jsonrpc":"2.0",
  "id":1,
  "method":"lightwallet_broadcast",
  "params":[{"ref_block_num":20295,"ref_block_prefix":1522980328,"expiration":"2018-12-26T06:04:55","operations":[[0,{"fee":{"amount":200,"asset_id":"1.3.0"},"from":"1.2.0","to":"1.2.0","from_addr":"XWCNRhTbDKiw2ut91BJEc5zy49HKWQnRw9as7","to_addr":"XWCNUFt3gViQn3iXLRL9eTMGsaJFhYQ6RT4gM","amount":{"amount":10000000,"asset_id":"1.3.3"},"extensions":[]}]],"extensions":[],"signatures":["20434f13d89a088a1f6c3d4978c961885ff193237dca6dbae0e48224afb318f57c28001dd9162984a4f970979ffaf9870359c3da722af6699336a8d53b27c0ae60"]}]
}

response

{
"id": 1,
"result": "94711706fd82c84f3961136ba44d5dc251b8abb1"
}

返回参数:

result中返回的字符串即为交易的id

# HRC12代币接口

合约调用通用接口

对于HRC12代币,所有的接口调用都是通过智能合约接口调用完成,因此有相对统一的格式。智能合约的调用接口分为三类,分别有三种不同的格式:

  1. invoke_contract:该类型调用需要消耗一定量的XWC作为GAS,结果会在区块链上记录。其格式为:

    method - invoke_contract 参数1 – 账户名(可以是本地账户名) 参数2 - Gas limit, 执行每一笔花费的gas,通常设置0.00001即可,如果网络拥堵可以提高该值优先打包 参数3 - 总的gas费用, 该值是一个预计值,打包时会按照实际执行步数收取。如果实际的值小于该值,以实际的为准。否则该交易会失败,如果该失败交易未上链,则费用退回,否则费用不退。 参数4 – 合约地址 参数5 - 合约方法名, 根据实际合约的API文档填入即可 参数6 - 合约API参数, 根据合约实际的API文档填入接口(通常是多个以“,”分割的字符串)

  2. invoke_contract_testing: 该类型接口跟上一个执行同样的逻辑,但是不会广播到区块链上,只会返回运行中消耗的GAS,但不会实际消耗。主要用于在调用正式接口之前进行测试,对需要消耗的GAS做一个估算。 其格式为:

    method - invoke_contract_testing 参数1 – 账户名(可以是本地账户名) 参数2 – 合约地址 参数3 - 合约方法名, 根据实际合约的API文档填入即可 参数4 - 合约API参数, 根据合约实际的API文档填入接口(通常是多个以“,”分割的字符串)

  3. invoke_contract_offline:该类型的接口只在本地进行计算,通常是进行一些查询的功能,不消耗GAS 其格式为:

    method - invoke_contract_testing 参数1 – 账户名(可以是本地账户名) 参数2 – 合约地址 参数3 - 合约方法名, 根据实际合约的API文档填入即可 参数4 - 合约API参数, 根据合约实际的API文档填入接口(通常是多个以“,”分割的字符串)

invoke_contract_testing方法仅可对非offline类型的接口来执行,用于估算即使gas消耗。实际使用中会在testing接口返回的gas值上增加一点来传入实际的invoke_contract方法。

[offline]获取HRC12代币符号

请求方法:tokenSymbol

请求参数:无

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract_offline", 
  "params": ["test", "XWCCWMNwuFzr3JSiDvGjZasDCm6dn2mVvxXKU", "tokenSymbol", ""], 
  "id": 1
}

参数说明

method:根据HRC12规范,该接口是offline接口,因此method为”invoke_contract_offline”

test:执行合约的账户名(可以是本地账户),应该根据实际情况自行修改

XWCCWMNwuFzr3JSiDvGjZasDCm6dn2mVvxXKU:合约地址,每一个智能合约都有一个唯一的地址,请根据实际情况修改

tokenSymbol:合约方法,用于查询HRC12代币的符号

其他参数:根据不同的智能合约接口,参数不同,请参考具体规范。在tokenSymbol这个方法里不需要额外参数,但是需要一个空字符串占位用。

response

{
"id": 1,
"jsonrpc": "2.0",
"result": "BTM"
}

返回结果中BTM为HRC12代币的符号。

[offline]获取token名称

请求方法:tokenName

请求参数:无

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract_offline", 
  "params": ["a", "XWCCWMNwuFzr3JSiDvGjZasDCm6dn2mVvxXKU", "tokenName", ""], 
  "id": 1
}

response

{
"id": 1,
"jsonrpc": "2.0",
"result": "Bytom"
}

返回参数:

返回结果中BTM为HRC12代币的名称。

[offline]获取token总量

请求方法:totalSupply

请求参数:无

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract_offline", 
  "params": ["a", "XWCCWMNwuFzr3JSiDvGjZasDCm6dn2mVvxXKU", "totalSupply", ""], 
  "id": 1
}

response

{
"id": 1,
"jsonrpc": "2.0",
"result": "2100000000"
}

返回参数:

返回结果中2100000000为HRC12代币的总供应量。

[offline]获取token精度

请求方法:precision

请求参数:无

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract_offline", 
  "params": ["a", "XWCCWMNwuFzr3JSiDvGjZasDCm6dn2mVvxXKU", " precision", ""], 
  "id": 1
}

response

{
"id": 1,
"jsonrpc": "2.0",
"result": "100000000"
}

返回参数:

返回结果中100000000为HRC12代币的精度,表示该代币最小单位是100000000分之一。

[offline]获取某个账户的余额

请求方法:balanceOf

请求参数:要查询的地址

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract_offline", 
  "params": ["a", "XWCCYDj67eqDChkrg1pmkm17LmWZCkVZdCSQd", "balanceOf", "XWCNWgseVgYxqJrWq4v7QbXjDiT7FAGToTa2R"], 
  "id": 1
}

response

{
"id": 1,
"jsonrpc": "2.0",
"result": "99699999800000000"
}

返回参数:

返回结果中99699999800000000为查询地址拥有HRC12代币的数量,显示的时候需要除以精度。

转账

请求方法:transfer

请求参数:转入地址,金额,备注

金额是不带精度的,需要以实际的金额乘以代币的精度。备注是可选的。

request

{
  "jsonrpc": "2.0", 
  "method": "invoke_contract", 
  "params": ["a", 0.00001, 500000, "XWCCYDj67eqDChkrg1pmkm17LmWZCkVZdCSQd", "transfer", "XWCNbtEpjh3GuSCSTAUtaC9vJUoKWjmEY8nnD,10,test"], 
  "id": 1
}

response

{
"id": 1,
"jsonrpc": "2.0",
"result": {
"ref_block_num": 47218,
"ref_block_prefix": 303117421,
"expiration": "2019-03-06T05:39:30",
"operations": [
[
79,
{
"fee": {
"amount": 5100,
"asset_id": "1.3.0"
},
"invoke_cost": 500000,
"gas_price": 1,
"caller_addr": "XWCNWgseVgYxqJrWq4v7QbXjDiT7FAGToTa2R",
"caller_pubkey": "0362e1605ebc5e85ae510a4f2c736a1a6f9b6ce2b4979ea62b6b872d169ac4ba56",
"contract_id": "XWCCYDj67eqDChkrg1pmkm17LmWZCkVZdCSQd",
"contract_api": "transfer",
"contract_arg": "XWCNbtEpjh3GuSCSTAUtaC9vJUoKWjmEY8nnD,10,test"
}
]
],
"extensions": [],
"signatures": ["1f5481cae439b77103daf1ade23de91d2274aab448f3065e985c5a4f6741c3fd8906ecc730043101bad1a376da69605671218703ed617e80791b0ab4eb7d1fee02"
],
"block_num": 0,
"trxid": "29e16b8e00e3f9fd0714a7f469a0250ef179f76c"
}
}

返回参数:

返回结果是上链的交易信息。

# 注意事项

  • 返回值中的时间都是标准格林尼治时间
  • 返回值中的金额是带精度的金额,需要缩小100000倍才是真正的金额,比如转账1个XWC,那么在返回值中标示为100000

# 参考文档

HRC12规范:https://github.com/HcashOrg/HyperExchange/wiki/XWC-Token-contract-protocol(HRC12) (opens new window)

# 附:终端命令行模式下常用指令

1.创建钱包

set_password 12345678

参数: 钱包密码

该操作会生成一个钱包文件,默认为wallet.json, 如果该文件已经存在,则set_password将会变为修改密码操作

2.解锁钱包

unlock 12345678

参数:钱包密码

3.创建账号

wallet_create_account testaccount

参数:账户名称

4.导入私钥

import_key testaccount1 私钥 

参数:本地不存在的账户名称 私钥

5.列出钱包下所有账号

list_my_accounts

6.列出账号地址

get_account_addr testaccount

参数:账户名称

7.导出私钥

dump_private_key  testaccount1

参数:账户名

8.查询余额

get_account_balances testaccount

参数:账户名

9.查询链上参数

get_global_properties

参数:无