发布时间: 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"}
发送时确保: 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 }
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 .
因为到时候我们需要一个操作: 为某个address打入一定的btc. ( 例如 0.0001 ) 这样的话才能把里面的usdt转出来.
所以我们就需要知道某个address的btc余额.
但是bitcoin的机制是: 不能根据address查询余额, 只能查询某个account的余额.
所以, 我们在创建omni的 btc地址的时候, 就要传入一个参数, 例如某个用户的id . 作为该BTC address的 account
这样,查询的时候, 就可以直接 根据 account 来查询address 的BTC余额了.
(也就是说, 在usdt 的钱包层面,需要一个address 对应一个account )
这里跟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