這篇文章我將著重介紹命令行錢包相關(guān)操作,以及各種基礎(chǔ)錯(cuò)誤的意思育叁,同時(shí)我還將介紹如何快速搭建錢包服務(wù)器诱贿,使自己在bitshares交易中,快人一步罐栈。
往期文章:
首次啟動(dòng)命令行
啟動(dòng)命令在上一篇文章中已經(jīng)介紹過了,但是這里為了連貫性,就再重復(fù)一遍
./cli_wallet --server-rpc-endpoint=ws://127.0.0.1:8056 --chain-id=baf152712ac44cf347702b32ebaea7674295b7f023ca96f99b5039f1f782279e
啟動(dòng)后會(huì)在命令行窗口中發(fā)現(xiàn)
Please use the set_password method to initialize a new wallet before continuing
new >>>
這個(gè)標(biāo)志著命令行錢包是第一次啟動(dòng)黍衙,或者沒有找到啟動(dòng)時(shí)所在文件夾下對應(yīng)的wallet.json(cli錢包文件:里面加密保存了你之前導(dǎo)入過的賬戶和私鑰),接下來我們需要做的就是執(zhí)行它給出的提示
set_password 123456
#123456 在這里為下次重新進(jìn)入錢包時(shí)候需要輸入的密碼,cli_wallet這里用這個(gè)密碼給你的錢包文件中的私鑰部分做一次AES加密
命令行提示就會(huì)變成這個(gè)
lock >>>
一般情況下,密碼不是太過復(fù)雜的話荠诬,直接就會(huì)成功琅翻,這個(gè)返回值是一個(gè)null。密碼太復(fù)雜有時(shí)候會(huì)報(bào)錯(cuò)柑贞,這個(gè)希望解決的話就只能從源代碼層面修復(fù)了望迎,不過如果是本地的話,可以設(shè)置一個(gè)相對簡單一點(diǎn)的密碼凌外,因?yàn)楫吘惯@個(gè)文件不會(huì)隨便就給別人
unlock 123456
#這一步標(biāo)志著需要解鎖錢包(所有需要私鑰的相關(guān)操作均需先對錢包進(jìn)行解鎖操作)
如果你的密碼沒有錯(cuò)誤的情況下辩尊,解鎖基本是成功的,命令行一般會(huì)返回如下提示
unlock >>>
現(xiàn)在也就是到錢包的最后一步了,也就是將自己的私鑰導(dǎo)入到錢包中
import_key "你的用戶名" "你的私鑰"
#這里不論用戶名是正確還是錯(cuò)誤的情況下命令行都會(huì)提示你錢包備份
#成功會(huì)提示true 失敗會(huì)提示false或者其他的報(bào)錯(cuò)信息
標(biāo)準(zhǔn)啟動(dòng)命令行
這里的標(biāo)準(zhǔn)的意思是康辑,已經(jīng)設(shè)置過密碼摄欲,并且導(dǎo)入過私鑰了,后再次啟動(dòng)命令行錢包
這里只需要做一步操作疮薇,就是用首次啟動(dòng)時(shí)候的密碼解鎖錢包就可以了
命令行錢包賬戶操作
下面包含了許多命令以及對應(yīng)的解釋
- 轉(zhuǎn)賬
#轉(zhuǎn)賬的參數(shù) 依次是 命令 transfer 轉(zhuǎn)賬發(fā)起者 轉(zhuǎn)賬接收者 轉(zhuǎn)賬數(shù)量 轉(zhuǎn)賬幣種名稱 轉(zhuǎn)賬備注(如果沒有備注也需要傳"") 是否廣播
#其中是否廣播這個(gè)字段一般都需要填true(不廣播的意思就是只是在本地中生成這個(gè)交易胸墙,但是并不將這個(gè)交易推送到見證人節(jié)點(diǎn)上,也就是說交易并沒有生效)
transfer "test" "test1" 100 BTS "" true
- 掛單
個(gè)人覺得bitshares區(qū)塊鏈這個(gè)的命令非嘲粗洌坑迟隅,用起來總感覺非常怪
掛單無論買賣統(tǒng)一都是調(diào)用一個(gè)接口,不同就是買賣的時(shí)候傳的幣種是相反的
#掛單的參數(shù)依次是 命令 sell_asset 掛單賬戶 希望賣出數(shù)量 希望賣出幣種 最少希望得到數(shù)量 最少希望得到幣種 超時(shí)不成交撤單時(shí)間(單位:s) 允不允許多單成交 是否廣播
sell_asset test 100 BTS 100 CNY 86400 true true
- 抵押|借入
每個(gè)用戶只能擁有一次抵押励七,如果當(dāng)次做過抵押后智袭,下一次只能更新本次抵押,在本次抵押沒有徹底還清之前掠抬,所做的抵押只能是更新當(dāng)前抵押吼野。這個(gè)不是很好理解對吧
#借入的參數(shù)依次是 命令 borrow_asset 借入賬戶名稱 借入數(shù)量 借入幣種數(shù)量 抵押數(shù)量 是否廣播
borrow_asset test 100 CNY 100 true
下面我舉個(gè)栗子??:
假如說用戶test首次調(diào)用該命令
borrow_asset test 100 CNY 111 true
在這次他抵押了111個(gè)BTS并且換回了100個(gè)CNY
接下來他再次調(diào)用該命令
borrow_asset test 100 CNY 111 true
他又抵押了111個(gè)BTS然后換回了100個(gè)CNY
結(jié)合第一次的命令,他擁有的CNY和抵押BTS分別是200個(gè)和222個(gè)
假如說這陣他想將自己的債務(wù)償還該怎么做呢?
還是調(diào)用該命令,只不過是將兩個(gè)數(shù)量傳成負(fù)數(shù)的
borrow_asset test -200 CNY -222 true
這樣之后他就沒有債務(wù)了两波,債務(wù)調(diào)整也就是通過傳入數(shù)值的正負(fù)來進(jìn)行額度的相關(guān)調(diào)整
- 升級會(huì)員
比特股中瞳步,幾乎所有操作都需要收取手續(xù)費(fèi)闷哆,手續(xù)費(fèi)的一定比例會(huì)返回給這個(gè)賬戶的注冊人,以及推薦人单起。升級終身會(huì)員后抱怔,原本要返回的手續(xù)費(fèi)會(huì)返還給自己。同時(shí)終身會(huì)員也是成為理事會(huì)成員與見證人的前提條件
升級會(huì)員還有一個(gè)選項(xiàng)叫季度會(huì)員嘀倒,但這個(gè)會(huì)員的相關(guān)情況我沒有進(jìn)行過什么研究野蝇,如果有知道的同學(xué)可以跟我說說
#升級終身會(huì)員的參數(shù) 命令 upgrade_account 需要升級賬戶名 是否升級成終身會(huì)員 是否廣播
upgrade_account test true true
- 注冊新用戶
注冊新用戶的時(shí)候并不需要新用戶的私鑰,但是需要的是注冊人與邀請人必須都是終身會(huì)員括儒。同時(shí)請注意绕沈,注冊新用戶的時(shí)候也是需要花費(fèi)手續(xù)費(fèi)的,并且注冊用戶的用戶名 包含a e i o u y中的任何一個(gè)字符的時(shí)候都將收取更多的手續(xù)費(fèi)帮寻,具體的手續(xù)費(fèi)數(shù)量將由區(qū)塊鏈參數(shù)決定
#注冊新用戶的參數(shù) 命令 register_account 注冊的賬戶名 賬戶權(quán)限公鑰 賬戶操作權(quán)限私鑰 注冊人 推薦人 注冊人與推薦人之間的分成 是否廣播
register_account test BTS54Af8hHnJntdL1gnDBzPwmKh4GayHoQyncouBu6fJbAhCLuuwJ BTS54Af8hHnJntdL1gnDBzPwmKh4GayHoQyncouBu6fJbAhCLuuwJ register register 100 true
命令行錢包查詢操作
我們作為區(qū)塊鏈上的一個(gè)用戶乍狐,很多時(shí)候需要查詢區(qū)塊鏈的相關(guān)信息,以方便做出我們的決策固逗。在這里只是將這些操作給出浅蚪,如果不是必須要通過這些命令查詢,請?jiān)诰W(wǎng)頁端執(zhí)行相關(guān)操作烫罩,網(wǎng)頁能帶來更詳細(xì)的數(shù)據(jù)分析與相對體驗(yàn)惜傲。
- 賬戶歷史記錄查詢
#查詢賬戶歷史 命令 get_account_history 需要查詢的用戶名 查詢的條數(shù)
get_account_history test 100
調(diào)用命令行請求返回的是cli錢包美化過的數(shù)據(jù)。返回會(huì)描述什么時(shí)間做過什么操作(如果查詢轉(zhuǎn)賬備注贝攒,則至少需要向cli提前導(dǎo)入交易雙方的任意一方私鑰)
注:這個(gè)查詢相對較慢盗誊,因?yàn)椴樵兯杏涗洉?huì)連帶著查詢對應(yīng)的賬戶信息等等
- 獲取借入信息
通過這條命令能查詢出當(dāng)前還存在的借入信息,返回的是json數(shù)據(jù)隘弊,cli并未對這條命令做美化哈踱,所以我們通過命令行查看的都是原始數(shù)據(jù)。
#獲取借入信息 命令 get_call_orders 幣種名稱 查詢單數(shù)
get_call_orders CNY 100
這里我會(huì)展示測試鏈的數(shù)據(jù)并大致解釋每個(gè)字段的含義梨熙,我展示的數(shù)據(jù)不具有任何實(shí)際意義
[{
"id": "1.8.6",
"borrower": "1.2.1909",
"collateral": "19999996000000",
"debt": "1000000000000",
"call_price": {
"base": {
"amount": 4999999,
"asset_id": "1.3.0"
},
"quote": {
"amount": 437500,
"asset_id": "1.3.1"
}
}
},{
"id": "1.8.0",
"borrower": "1.2.1019",
"collateral": 33333000,
"debt": 1000000,
"call_price": {
"base": {
"amount": 33333,
"asset_id": "1.3.0"
},
"quote": {
"amount": 1750,
"asset_id": "1.3.1"
}
}
}
]
id:訂單編號
borrower:借入發(fā)起人
collateral:借入金額(需要除以幣種精度位)
debt:抵押金額(需要除以幣種精度位)
call_price(借入價(jià)格):需要用戶自己去做除法進(jìn)行計(jì)算最終真實(shí)價(jià)格(都需要除以有效精度)
- 獲取撮合交易掛單記錄
對于自動(dòng)交易機(jī)器人而言开镣,需要最多的就是查詢區(qū)塊鏈撮合市場信息,以探知區(qū)塊鏈?zhǔn)袌錾疃取?/p>
#獲取撮合交易掛單記錄 命令 get_limit_orders 交易幣種A 交易幣種B 獲取單數(shù)
get_limit_orders BTS CNY 100
返回字段:
{
"id": "1.7.6475",
"expiration": "2019-07-07T00:39:44",
"seller": "1.2.1626",
"for_sale": "29300000000",
"sell_price": {
"base": {
"amount": "29300000000",
"asset_id": "1.3.0"
},
"quote": {
"amount": "439500000000",
"asset_id": "1.3.1"
}
},
"deferred_fee": 0
}
id:訂單編號
expiration:訂單到期時(shí)間
seller:賣出人
for_sale:賣出金額(需要除以幣種精度位)
sell_price(借入價(jià)格):需要用戶自己去做除法進(jìn)行計(jì)算最終真實(shí)價(jià)格(都需要除以有效精度咽扇,同時(shí)買單賣單也需要由用戶去分辨邪财,通過比較base和quote的asset_id去判斷這個(gè)究竟屬于什么)
- 獲取當(dāng)前區(qū)塊鏈擁有資產(chǎn)
區(qū)塊鏈提供了查詢資產(chǎn)的一個(gè)命令,這個(gè)命令對于我們還是很友好的
#獲取資產(chǎn) 命令 list_assets 查詢?nèi)刻?具體意思暫時(shí)不明)"" 查詢數(shù)量(最大100條)
list_assets "" 100
其中中間的那個(gè)字符串參數(shù)含義暫時(shí)不明质欲,需要隨后再進(jìn)行研究
[{
"id": "1.3.2",
"symbol": "BTC",
"precision": 8,
"issuer": "1.2.6",
"options": {
"max_supply": "1000000000000000",
"market_fee_percent": 0,
"max_market_fee": 0,
"issuer_permissions": 463,
"flags": 0,
"core_exchange_rate": {
"base": {
"amount": 280000,
"asset_id": "1.3.0"
},
"quote": {
"amount": 1000,
"asset_id": "1.3.2"
}
},
"whitelist_authorities": [],
"blacklist_authorities": [],
"whitelist_markets": [],
"blacklist_markets": [],
"description": "",
"extensions": []
},
"dynamic_asset_data_id": "2.3.2",
"bitasset_data_id": "2.4.0"
}]
id:資產(chǎn)id
symbol:資產(chǎn)符號
precision:資產(chǎn)有效位數(shù)
issuer:資產(chǎn)發(fā)行人賬戶
options:資產(chǎn)相關(guān)信息(資產(chǎn)最大供應(yīng)量树埠,手續(xù)費(fèi)池兌換比例,操作權(quán)限)
dynamic_asset_data_id:動(dòng)態(tài)資產(chǎn)標(biāo)志
bitasset_data_id:這個(gè)字段標(biāo)志著資產(chǎn)是否是智能資產(chǎn)把敞,如果有則說明這個(gè)資產(chǎn)是智能弥奸,否則就不是
- 查看賬戶余額
#查看賬戶余額 命令 list_account_balances 查看賬戶名 查看幣種(最大100條)
list_account_balances test 100
這個(gè)的返回值很簡單榨惠,就不過多贅述
- 查看錢包已導(dǎo)入賬戶
list_my_accounts
- 查看已導(dǎo)入的賬戶私鑰
dump_private_keys
- 查看區(qū)塊鏈信息
這個(gè)方法可以說是區(qū)塊鏈里的萬能方法奋早,幾乎可以查詢區(qū)塊鏈中的一切盛霎,只要你想知道
get_object x.x.x
在上面我展示的示例中有許多1.x.x的,所有這一類id在區(qū)塊鏈中統(tǒng)一標(biāo)志為區(qū)塊鏈的事物耽装,不論是賬戶愤炸,還是資產(chǎn),所有的東西都擁有著自己的id掉奄,只要通過get_object + 對應(yīng)id 就可以看到這個(gè)id代表的詳細(xì)意思了规个。返回值就不多說了,根據(jù)區(qū)塊鏈信息而做相應(yīng)返回
錢包服務(wù)器啟動(dòng)
命令行錢包就我個(gè)人認(rèn)為更多的是用來幫助我們構(gòu)建自有機(jī)器人的姓建,或者基于它之上構(gòu)建一些上層app诞仓,以及操作一下ui端未提供的底層api
我們在這里可以很輕松的就用命令行錢包啟動(dòng)成一個(gè)支持http請求的一個(gè)服務(wù)器,我們可以用cli自建交易所對接|以及自動(dòng)化買單賣單機(jī)器人
啟動(dòng)它也很簡單速兔,只需要在標(biāo)準(zhǔn)cli啟動(dòng)命令中增加一個(gè)參數(shù) --rpc-http-endpoint=127.0.0.1:8111 就可以啟動(dòng)一個(gè)只對內(nèi)網(wǎng)開放8111端口的服務(wù)器
注:在絕大多數(shù)情況下墅拭,請不要將錢包服務(wù)器端口開放成0.0.0.0因?yàn)檫@個(gè)非常危險(xiǎn),相當(dāng)于將私鑰暴露給了一個(gè)任何能訪問到你的服務(wù)器的人涣狗。
#備注:如果希望錢包能一直啟動(dòng)在后臺谍婉,我提供一個(gè)新的啟動(dòng)命令
nohup ./cli_wallet --server-rpc-endpoint=ws://你希望連接的節(jié)點(diǎn)地址 --chain-id=你希望連接的鏈id --rpc-http-endpoint=127.0.0.1:8111 &
#其中,nohup + & 標(biāo)志著希望cli在后臺運(yùn)行
一旦采用后臺方式啟動(dòng)cli镀钓,則無法再通過命令行方式對錢包進(jìn)行操作穗熬,一切操作cli只能走標(biāo)準(zhǔn)的httpPost請求;如果希望能讓cli同時(shí)支持前臺命令行參數(shù),與后臺http請求方式丁溅,在這里我給出一個(gè)新的方案唤蔗。linux里有一個(gè)軟件包叫screen,通過screen啟動(dòng)命令行后即可支持前后臺同時(shí)運(yùn)行窟赏。(cli命令為串行模式,也就是說在后臺的請求接口尚未返回前措译,前臺調(diào)用的操作將不會(huì)響應(yīng))
啟動(dòng)說完了,下一步將會(huì)說明如何通過http請求調(diào)用cli
首先標(biāo)準(zhǔn)的http協(xié)議我就不綴述了,cli支持的協(xié)議也是非常標(biāo)準(zhǔn)的http協(xié)議饰序。
cli需要用戶在post請求的body中傳的參數(shù)是一個(gè)json串,header中添加Content-Type為application/json
上傳json基礎(chǔ)參數(shù)
{
"jsonrpc":"2.0",//固定參數(shù)领虹,也可不傳此字段
"method":"",//這個(gè)字段為命令行中對應(yīng)操作的參數(shù)如查詢賬戶歷史記錄就是get_account_history
"params":[],//這個(gè)字段就是命令行中各個(gè)字段的具體參數(shù),為數(shù)組類型求豫,將命令行中原有參數(shù)依次填入即可塌衰,如查看賬戶歷史記錄則是["test",100]
"id":1//這個(gè)字段標(biāo)志著cli返回時(shí)的具體id
}
區(qū)塊鏈的返回也是json
{
"id":1,//上傳時(shí)候的標(biāo)志位
"result"://這個(gè)里面返回了命令行中未美化過的數(shù)據(jù),具體內(nèi)容由用戶傳入的參數(shù)決定
}
這個(gè)需要每個(gè)人自己多去嘗試蝠嘉,目前作者發(fā)現(xiàn)同一時(shí)間內(nèi)的請求最好不要太多最疆,cli支持不了大并發(fā),但是對于批量轉(zhuǎn)賬蚤告,等等的一些其他的功能努酸,cli支持的還是挺好的
標(biāo)準(zhǔn)異常說明
在操作中,我們總會(huì)看見cli返回這樣或者那樣的錯(cuò)誤杜恰。在這里获诈,作者總結(jié)出一些較為常見的錯(cuò)誤仍源,如果你們在交易中發(fā)現(xiàn)了相關(guān)錯(cuò)誤代碼,可以在這里用ctrl+f搜索一下關(guān)鍵字
- 缺少相關(guān)參數(shù)
10 assert_exception: Assert Exception
a0 != e: too few arguments passed to method
這個(gè)問題解決起來很容易舔涎,一般出現(xiàn)在比如這個(gè)操作需要2個(gè)參數(shù) 比如
list_account_balance test 100
需要兩個(gè)參數(shù)分別是test和100笼踩,但是只傳了一個(gè)參數(shù)進(jìn)去,cli就會(huì)報(bào)這個(gè)錯(cuò)誤
解決方案:將參數(shù)填齊即可
- 錢包解鎖失敗
18 aes_exception: AES error
error during aes 256 cbc decrypt final
這個(gè)錯(cuò)誤一般只出現(xiàn)在unlock中,意思就是unlock的密碼和最開始set_password的密碼不一樣
解決方案:輸入正確密碼
- 錢包已鎖定
10 assert_exception: Assert Exception
!self.is_locked():
報(bào)錯(cuò)信息是錢包尚未解鎖
解決方案:需要調(diào)用unlock
- 找不到用戶
10 assert_exception: Assert Exception
rec && rec->name == account_name_or_id:
這個(gè)問題發(fā)生概率很高亡嫌,因?yàn)橛袝r(shí)候人填寫命令的時(shí)候經(jīng)常會(huì)出錯(cuò)嚎于,出現(xiàn)這個(gè)問題的原因一定是對應(yīng)需要填寫用戶名的地方填寫有誤。
解決方案:仔細(xì)查看對應(yīng)賬戶挟冠,修改正確即可
- 缺少必要權(quán)限
Caught exception while broadcasting tx 0432daa02f98efc2258c40ebf9b538444eaa65e3: 0 exception: unspecified
missing required active authority: Missing Active Authority 1.2.25
這類問題一般都會(huì)返回missing required xxx authority:后面+上一個(gè)1.2.xx的信息于购,這種情況一般是import_key出錯(cuò)了,也有一些其他原因知染,但基本上不會(huì)出現(xiàn)于命令行錢包中
解決方法:首先調(diào)用get_object 查看對應(yīng)賬戶价涝,然后將對應(yīng)賬戶私鑰導(dǎo)入錢包即可解決大部分的此類問題
- 賬戶余額不足
Caught exception while broadcasting tx 46778625acf1e03f28bebbec1f976a418251ec01: 0 exception: unspecified
Assert Exception: insufficient_balance: Insufficient Balance: 0 BTS
這個(gè)問題出現(xiàn)的原因就是余額不足
解決方案:充錢,充值就好了
文終總結(jié)
cli上還有許多東西沒有講解持舆,比如創(chuàng)建資產(chǎn)色瘩,以及其他的一些操作。
創(chuàng)建cli服務(wù)器的時(shí)候一定要注意逸寓,盡量==不要對全網(wǎng)公開居兆,危險(xiǎn)性極高==
關(guān)于錯(cuò)誤提示,提示小段文字的時(shí)候一般是在cli端校驗(yàn)出錯(cuò);大段文字基本上就是本地cli校驗(yàn)通過竹伸,而區(qū)塊鏈見證人節(jié)點(diǎn)校驗(yàn)失敗
最后泥栖,cli只是bitshares官方的一個(gè)c++用戶端程序,它有很多自身的缺陷勋篓。下一篇我會(huì)講一講如何增加一個(gè)自己定義的cli方法
還是上一篇一樣吧享,推廣一下自己的java庫,bitsharesWallet如果有想做bitshares相關(guān)的java服務(wù)器,可以采用這個(gè)試試