Back

[**] - usdt 的RPC 的使用(新建地址, 转账,查询余额等)

发布时间: 2018-12-16 11:34:00

这里的一篇文章不错, http://www.wangl.info/2018/07/18/omni-core%E7%9A%84%E4%BD%BF%E7%94%A8/
这个是omni core的 RPC列表: https://github.com/OmniLayer/omnicore/blob/master/src/omnicore/doc/rpc-api.md#omni_send

我怕丢失, 所以把内容复制在下面了.

USDT的区块高度跟 BTC是一样的 . 

据说 USDT是BTC的侧链, 那么:  手续费啥的应该一样, block data应该一样. 

新建地址

跟BTC一样

curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "^Ctbalance", "params": []}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/

查询余额

这里要使用 omni_getbalance  'address', 31 来查询, 注意  地址和  31 不能省略, 31就是omni 上发的代币. 

curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "omni_getbalance", "params": ["1A4spg8hES1hUddtKQF6x16z5mi6BrjXp3", 31]}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/ | json_pp
{
   "error" : null,
   "id" : "curltest",
   "result" : {
      "balance" : "203.98550000",
      "frozen" : "0.00000000",
      "reserved" : "0.00000000"
   }
}

使用getbalance查询的是BTC的余额, 不是USDT的

$ curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "getbalance", "params": []}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/
{"result":0.00000546,"error":null,"id":"curltest"}

发送USDT

发送时确保:  sender address (注意不是钱包!! )中有btc  (发送过程见:  https://bitcoin.stackexchange.com/questions/75861/how-can-i-transfer-tetherusdt-using-omni-json-rpc-api  )  

# 向持有USDT的账户转账 BTC 
$ curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "sendtoaddress", "params": ["1A4spg8hES1hUddtKQF6x16z5mi6BrjXp3", 0.0008]}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/ | json_pp
{
   "result" : "d37f36b248a8ccf47f699ef5c7244327011e1f41014a98f40a27fee880a46b6c",
   "error" : null,
   "id" : "curltest"
}

# 好了, 转账成功 
$ curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "omni_send", "params": ["1A4spg8hES1hUddtKQF6x16z5mi6BrjXp3", "1PTmQski3WLdcDq1Kyu5ce4dZMuPKBVgNj", 31, "20.0"]}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/ | json_pp 
   "result" : "7b8f44b0f542fe2876731f5b4a92e95d8dda7148a8f354e2ad07891e21251d9a",
   "id" : "curltest",
   "error" : null
}

注意: sender address 中必须有足够的btc, 否则会报错. ( 参考:  https://github.com/OmniLayer/omniwallet/issues/1319)

如果钱包中没有足够的BTC, 那么就转账不成功( code: -206  . https://github.com/OmniLayer/omnicore/issues/490)

$ curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "omni_send", "params": ["1A4spg8hES1hUddtKQF6x16z5mi6BrjXp3", "1PTmQski3WLdcDq1Kyu5ce4dZMuPKBVgNj", 31, "20.0"]}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/ | json_pp
{
   "error" : {
      "code" : -206,
      "message" : "Error with selected inputs for the send transaction"
   },
   "id" : "curltest",
   "result" : null
}

查询某个omni 节点中的所有地址:

curl --user user:pwd --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "listaddressgroupings", "params": []}' -H 'content-type:text/plain;' http://127.0.0.1:8332/ | json_pp

注意上面的 --user user:password 要改成你自己的

创建地址时候的注意事项: 加上account! 方便余额的查询!

创建地址时,一定要加上 account .

因为到时候我们需要一个操作: 为某个address打入一定的btc. ( 例如 0.0001 ) 这样的话才能把里面的usdt转出来. 

所以我们就需要知道某个address的btc余额.

但是bitcoin的机制是: 不能根据address查询余额, 只能查询某个account的余额.

所以, 我们在创建omni的 btc地址的时候, 就要传入一个参数, 例如某个用户的id .   作为该BTC address的 account 

这样,查询的时候, 就可以直接 根据  account 来查询address 的BTC余额了.

(也就是说, 在usdt 的钱包层面,需要一个address 对应一个account )

根据account查询address: 

这里跟BTC有些区别. 参数不能是空,必须存在 ( bitcoin中, 参数为空时,列出所有account的所有addres)

curl --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "getaddressesbyaccount", "params": []}' -H 'content-type:text/plain;' http://coiex:[email protected]:8332/ | json_pp

{
   "id" : "curltest",
   "result" : null,
   "error" : {
      "code" : -1,
      "message" : "getaddressesbyaccount \"account\"\n\nDEPRECATED. Returns the list of addresses for the given account.\n\nArguments:\n1. \"account\"  (string, required) The account name.\n\nResult:\n[                     (json array of string)\n  \"bitcoinaddress\"  (string) a bitcoin address associated with the given account\n  ,...\n]\n\nExamples:\n> omnicore-cli getaddressesbyaccount \"tabby\"\n> curl --user myusername --data-binary '{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", \"method\": \"getaddressesbyaccount\", \"params\": [\"tabby\"] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n"
   }
}

另外注意:要使用独立的 btc 地址给 usdt的btc base 转账. 不要用某个usdt钱包的btc余额给其他的钱包转,否则该钱包会有"额外的"转账操作. 

例如: usdt coin base : btc_address_1,   0.06 btc

我们希望给 usdt address 2 转 0.0001 btc, 那么不要用btc_address_1, 否则会发现:

btc_address_1 在转账之后,会有额外的"找零"操作,导致自己的btc 余额 < 0.000001

附:一篇不错的文章

Omni core的使用
术语
Omni layer
是以比特币为基础,建立起来的存在于比特币协议与用户货币之间的新协议层,旨在成为任何人都可以建立自己的货币的基础。 实现Omni协议的软件将包含简单的工具,允许任何人使用自己的规则设计和发布自己的货币,而无需进行任何软件开发。

Omni core
完全验证桌面钱包
比特币核心的超集
Mac OS X,Windows和Linux
原生,跨平台用户接口
点对点分布式交易所交易
Omni 交易类型
当前有效的
– 0: Simple Send
– 3: Send To Owners
– 20: Sell Coins for Bitcoins (currency trade offer)
– 21: Offer/Accept Omni Protocol Coins for Another Omni Protocol Currency (currency – trade offer)
– 22: Purchase Coins with Bitcoins (accept currency trade offer)
– 50: Create a Property with fixed number of tokens
– 51: Create a Property via Crowdsale with Variable number of Tokens
– 52: Promote a Property
– 53: Close a Crowdsale Manually
– 54: Create a Managed Property with Grants and Revocations
– 55: Grant Property Tokens
– 56: Revoke Property Tokens
– 70: Change Property Issuer on Record

在将来增加的
– 2: Restricted Send
– 10: Mark an Address as Savings
– 11: Mark a Savings Address as Compromised
– 12: Mark an Address as Rate-Limited
– 14: Remove a Rate Limitation
– 30: Register a Data Stream
– 31: Publish Data
– 32: Create a List of Addresses
– 33: Removing Addresses from a List
– 40: Offer/Accept a Bet
– 60: List Something for Sale
– 61: Initiate a Purchase from a Listing
– 62: Respond to a Buyer Offer
– 63: Release Funds and Leave Feedback
– 100: Create a New Child Currency

从三个方面来讲述Omni core的使用
用来发送和接收符合Omni layer规范的代币
用于创建新的智能资产代币
用来在分布式交易所中买卖Omni layer资产
我们先从简单的使用代币进行交易开始
凡是以Omni layer规范发行的代币,都可以使用Omni core wallet来查看与交易。
比如USDT就是一种广泛使用的代币,USDT的PropertyID为31,点击这里查看所有已经创建的代币。
发送代币使用omni_send、查看余额与交易分别使用omni_getbalance与omni_gettransaction

omni_send
这个命令用于创建和广播一个Simple send交易,来完成代币资产所有权的转移,执行命令的钱包必须持有发送方的私钥
命令格式(详情请参考rpc-api说明)
omni_send “fromaddress” “toaddress” propertyid “amount” ( “redeemaddress” “referenceamount” )
返回结果
是一个16进制编码的交易Hash字符串

举个例子,如果我想要发送19.7个USDT给你,使用下面的命令


$ omnicore-cli "omni_send" "1L3MNP8e4NSt5RFWCE6UuyyPRYW9kaAZ8C" "1NiKUYyA1AUDe9KjvnCfy8kh5SZDY497PM" 31 "19.7"

1
2
$ omnicore-cli "omni_send" "1L3MNP8e4NSt5RFWCE6UuyyPRYW9kaAZ8C" "1NiKUYyA1AUDe9KjvnCfy8kh5SZDY497PM" 31 "19.7"

1L3MNP8e4NSt5RFWCE6UuyyPRYW9kaAZ8C 对应我的持有USDT的钱包地址
1NiKUYyA1AUDe9KjvnCfy8kh5SZDY497PM 对应你用来接收USDT的钱包地址

omni_getbalance
这个命令用来查询钱包中的余额,可以在任何一个omni core钱包上运行
omni_getbalance “address” propertyid
返回值是一个Json格式


{
"balance" : "n.nnnnnnnn", // (string) 这个地址可以使用的余额
"reserved" : "n.nnnnnnnn", // (string) 用于卖出保留和接受的金额
"frozen" : "n.nnnnnnnn" // (string) 由发行人冻结的金额 (仅仅应用于可管理资产代币)
}

1
2
3
4
5
6
{
"balance" : "n.nnnnnnnn", // (string) 这个地址可以使用的余额
"reserved" : "n.nnnnnnnn", // (string) 用于卖出保留和接受的金额
"frozen" : "n.nnnnnnnn" // (string) 由发行人冻结的金额 (仅仅应用于可管理资产代币)
}

举个例子
查看币安的USDT持有量


$ omnicore-cli "omni_getbalance", "1FoWyxwPXuj4C6abqwhjDWdz6D4PZgYRjA" 31

1
2
$ omnicore-cli "omni_getbalance", "1FoWyxwPXuj4C6abqwhjDWdz6D4PZgYRjA" 31

omni_gettransaction
这个命令用来获取交易的细节信息
用法
omni_gettransaction “txid”
返回值:


{
"txid" : "hash", // (string) 这个交易的16进制编码交易hash
"sendingaddress" : "address", // (string) 发送方的比特币地址
"referenceaddress" : "address", // (string) 接收方的比特币地址(如果有)
"ismine" : true|false, // (boolean) 表示交易涉及的地址是否在钱包中
"confirmations" : nnnnnnnnnn, // (number) 交易被确认的数量
"fee" : "n.nnnnnnnn", // (string) 比特币的交易费
"blocktime" : nnnnnnnnnn, // (number) 包含交易的区块的出块时间
"valid" : true|false, // (boolean) 表示交易是否有效
"positioninblock" : n, // (number) 交易在区块中的位置
"version" : n, // (number) 交易的版本
"type_int" : n, // (number) 交易类型号
"type" : "type", // (string) 交易类型字符串
[...] // (mixed) 其他交易类型规格属性
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"txid" : "hash", // (string) 这个交易的16进制编码交易hash
"sendingaddress" : "address", // (string) 发送方的比特币地址
"referenceaddress" : "address", // (string) 接收方的比特币地址(如果有)
"ismine" : true|false, // (boolean) 表示交易涉及的地址是否在钱包中
"confirmations" : nnnnnnnnnn, // (number) 交易被确认的数量
"fee" : "n.nnnnnnnn", // (string) 比特币的交易费
"blocktime" : nnnnnnnnnn, // (number) 包含交易的区块的出块时间
"valid" : true|false, // (boolean) 表示交易是否有效
"positioninblock" : n, // (number) 交易在区块中的位置
"version" : n, // (number) 交易的版本
"type_int" : n, // (number) 交易类型号
"type" : "type", // (string) 交易类型字符串
[...] // (mixed) 其他交易类型规格属性
}

例子:


$ omnicore-cli "omni_gettransaction" "76b5b58c9a150cbd44fe0a5882fb12f492a477449d6da5173af42247938893d4"

1
2
$ omnicore-cli "omni_gettransaction" "76b5b58c9a150cbd44fe0a5882fb12f492a477449d6da5173af42247938893d4"

发行新的智能资产代币
有三种发行的智能代币的方法,1.固定数量的代币,2.以众筹方式发行代币,3.后期可管理代币的发行和销毁
这三种类型代币的创建分别对应omni_sendissuancefixed、omni_sendissuancecrowdsale、omni_sendissuancemanaged

omni_sendissuancefixed
用来发行一个新的代币,总发行量固定不变
例如:
在主系统中发布一个新的代币,代币具有小数位,总发行量100万枚


$ omnicore-cli "omni_sendissuancefixed" \
"3Ck2kEGLJtZw9ENj2tameMCtS3HB7uRar3" 1 2 0 "Companies" "Bitcoin Mining" \
"Quantum Miner" "" "" "1000000"

1
2
3
4
$ omnicore-cli "omni_sendissuancefixed" \
"3Ck2kEGLJtZw9ENj2tameMCtS3HB7uRar3" 1 2 0 "Companies" "Bitcoin Mining" \
"Quantum Miner" "" "" "1000000"

omni_sendissuancecrowdsale
创建一个众筹项目来发发行代币,参与者在众筹活动期间,想发行人地址发送,有资格参与众筹的代币,即可获得新发行的代币作为奖励。代币发行的数量是随着参与筹集的代币数量而变化的
其中代币的发行有三种形式,1.参与者充值众筹代币按比例获取新代币奖励。2.早鸟期参与者按比例获取新代币奖励。3.每当有参与者冲入筹集代币,发行人按比例获取新代币奖励
例如:


$ omnicore-cli "omni_sendissuancecrowdsale" \
"3JYd75REX3HXn1vAU83YuGfmiPXW7BpYXo" 1 2 0 "Companies" "Bit-coin Mining" \
"Quantum Miner" "" "" 2 "100" 1483228800 30 2

1
2
3
4
$ omnicore-cli "omni_sendissuancecrowdsale" \
"3JYd75REX3HXn1vAU83YuGfmiPXW7BpYXo" 1 2 0 "Companies" "Bit-coin Mining" \
"Quantum Miner" "" "" 2 "100" 1483228800 30 2

omni_sendissuancemanaged
创建一个发行量可管理的代币
例如:


$ omnicore-cli "omni_sendissuancemanaged" \
"3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" 1 2 0 "Companies" "Bitcoin Mining" "Quantum Miner" "" ""

1
2
3
$ omnicore-cli "omni_sendissuancemanaged" \
"3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" 1 2 0 "Companies" "Bitcoin Mining" "Quantum Miner" "" ""

可管理代币创建成功后可使用omni_sendgrant、omni_sendrevoke

omni_sendgrant
授予或发行可管理代币的数量
例如:
增加发51号代币7000个


$ omnicore-cli "omni_sendgrant" "3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" "" 51 "7000"

1
2
$ omnicore-cli "omni_sendgrant" "3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" "" 51 "7000"

omni_sendrevoke
撤销可管理代币的数量
例如:
撤销51号代币1000个


$ omnicore-cli "omni_sendrevoke" "3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" "" 51 "1000"

1
2
$ omnicore-cli "omni_sendrevoke" "3HsJvhr9qzgRe3ss97b1QHs38rmaLExLcH" "" 51 "1000"

Omni layer资产交易所交易
omni_sendtrade
在分布式代币交易所放置一个交易报价
例如:
出售USDT 250个,需要OMNI 10个


$ omnicore-cli "omni_sendtrade" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 31 "250.0" 1 "10.0"

1
2
$ omnicore-cli "omni_sendtrade" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 31 "250.0" 1 "10.0"

omni_sendcanceltradesbyprice
指定价格取消在分布式代币交易所上的报价
例如:
取消用5个OMNI购买100个USDT的报价


$ omnicore-cli "omni_sendcanceltradesbyprice" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 31 "100.0" 1 "5.0"

1
2
$ omnicore-cli "omni_sendcanceltradesbyprice" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 31 "100.0" 1 "5.0"

omni_sendcanceltradesbypair
给出货币交易对取消所有分布式交易所中的报价
例如:
撤销所有出售OMNI购买USDT的报价


$ omnicore-cli "omni_sendcanceltradesbypair" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 1 31

1
2
$ omnicore-cli "omni_sendcanceltradesbypair" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 1 31

omni_sendcancelalltrades
取消分布式代币交所中所有报价
例如:
在主要生态系统中,撤销所有交易报价


$ omnicore-cli "omni_sendcancelalltrades" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 1

1
2
$ omnicore-cli "omni_sendcancelalltrades" "3BydPiSLPP3DR5cf726hDQ89fpqWLxPKLR" 1

omni_getactivedexsells
查询分布式代币交易所中当前活动状态的交易报价
例如:


$ omnicore-cli "omni_getactivedexsells"

1
2
$ omnicore-cli "omni_getactivedexsells"

omni_getorderbook
列出分布式代币交易所中活动状态的报价
例如:
列出所有出售TOMNI的活动报价


$ omnicore-cli "omni_getorderbook" 2

1
2
$ omnicore-cli "omni_getorderbook" 2

omni_gettrade
Get detailed information and trade matches for orders on the distributed token exchange.
获取所有在分布式代币交易所中的订单详情和交易匹配
例如:
列出1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d交易中的订单详情和交易匹配情况


$ omnicore-cli "omni_gettrade" "1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d"

1
2
$ omnicore-cli "omni_gettrade" "1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d"

omni_gettradehistoryforpair
从分布式代币交易所中检索出指定交易对的交易历史记录
例如:
找出OMNI/ZEND4的500条交易历史


$ omnicore-cli "omni_gettradehistoryforpair" 1 31 500

1
2
$ omnicore-cli "omni_gettradehistoryforpair" 1 31 500

omni_gettradehistoryforaddress
从分布式代币交易所中检索出指定地址的交易历史记录
例如:
检索出涉及1MCHESTptvd2LnNp7wmr2sGTpRomteAkq8地址的所有交易历史


$ omnicore-cli "omni_gettradehistoryforaddress" "1MCHESTptvd2LnNp7wmr2sGTpRomteAkq8"

1
2
$ omnicore-cli "omni_gettradehistoryforaddress" "1MCHESTptvd2LnNp7wmr2sGTpRomteAkq8"

omni_getactivations
返回待处理和已完成的活动
例子:


$ omnicore-cli "omni_getactivations"

1
2
$ omnicore-cli "omni_getactivations"

omni_senddexsell
例子:
出售OMNI数量1.5,需要bitcoin数量0.75,支付窗口期25个块,买方支付0.0005矿工费,这是一个新建报价


$ omnicore-cli "omni_senddexsell" "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa" 1 "1.5" "0.75" 25 "0.0005" 1

1
2
$ omnicore-cli "omni_senddexsell" "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa" 1 "1.5" "0.75" 25 "0.0005" 1

omni_senddexaccept
创建并广播指定代币和金额的接受报价
例子:
接受采购37FaKponF7zqoMLUjEiko25pDiuVH5YLEa 的OMNI金额为15.0


$ omnicore-cli "omni_senddexaccept" \
"35URq1NN3xL6GeRKUP6vzaQVcxoJiiJKd8" "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa" 1 "15.0"

1
2
3
$ omnicore-cli "omni_senddexaccept" \
"35URq1NN3xL6GeRKUP6vzaQVcxoJiiJKd8" "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa" 1 "15.0"

参考内容
Omnilayer协议规范
Omni core JSON-RPC API

Back