EOS代幣交易與提幣開發教程第二部分
投票帳戶歷史記錄
賬戶歷史記錄包括由賬戶授權或賬戶收到的所有操作。 由於交易所收到了eosio.token :: transfer操作,它已在歷史記錄中列出。 如果您使用控制台,確認和不可逆轉的交易以「綠色」列印,而未確認的交易以「黃色」列印。 您可以通過事務日誌中的第一個字元確定事務是否被確認:"#"用於不可逆轉,"?" 為潛在可逆的。
$ cleos get actions tokenxchange
# seq when contract::action => receiver trx id... args
================================================================================================================
# 0 2018-06-03T15:24:34.500 eosio.token::transfer => tokenxchange ce32ac1f... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
操作大量的資產轉移:
$ cleos transfer scott tokenxchange"1.0000 SYS"12345
executed transaction:9d9f981674073065d81491dc53a6d436fc383ff26eb34189f414f63481463822136bytes549us
# eosio.token
# scott
# tokenxchange
現在看看事務日誌:
$ cleos get actions tokenxchange
# seq when contract::action => receiver trx id... args
================================================================================================================
# 0 2018-06-03T15:24:34.500 eosio.token::transfer => tokenxchange ce32ac1f... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
# 1 2018-06-03T15:28:12.000 eosio.token::transfer => tokenxchange 9d9f9816... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
?22018-06-03T15:29:33.000eosio.token::transfer => tokenxchange05fd45b6... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
最後一次轉賬仍在等待中,等待不可逆轉。
「seq」列代表您的特定帳戶的操作索引。 隨著新的相關操作的添加,它會一直增加。
cleos get actions命令允許您對取回哪些操作進行一些控制。 您可以使用-h查看此命令的幫助
$ cleos get actions -h
ERROR: RequiredError: account_name
Retrieve all actions with specific account name referencedinauthorization or receiver
Usage: cleos get actions [OPTIONS] account_name [pos] [offset]
Positionals:
account_name TEXT name of account to query on (required)
pos INT sequence number of actionforthisaccount,-1forlast
offset INT get actions [pos,pos+offset]forpositive offset or [pos-offset,pos)fornegative offset
Options:
-j,--json print full json
--full don"t truncate action json
--pretty pretty print full action json
--console print console output generated by action
為了只獲得最後一個動作,你需要做以下的事情:
$ cleos get actions tokenxchange-1-1
# seq when contract::action => receiver trx id... args
================================================================================================================
# 2 2018-06-03T15:29:33.000 eosio.token::transfer => tokenxchange 05fd45b6... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
這個命令說到最後一個序列號(由pos = -1表示),然後在它之前(偏移量= -1)獲取「1」項。 使用上面的例子,這將返回僅在第2行的[3-1,3)或[2,3)範圍內的序列。在這種情況下,「-1」位置意味著「一個超過最後一個序列」和 像C ++容器的末端迭代器一樣運行。
僅提取「新」操作
由於我們假定您的交易所正在運行輪詢微服務,因此它會想要獲取「未處理的下一筆存款」。 在這種情況下,微服務將需要跟蹤「最後處理的seq」的seq編號。 為了這個例子,我們將假設「seq 0」已經被處理,並且我們想要獲取「seq 1」(如果有的話)。
我們通過pos = 1和offset = 0得到範圍[1,1 + 0]或[1,1]。
$ cleos get actions tokenxchange1
# seq when contract::action => receiver trx id... args
================================================================================================================
# 2 2018-06-03T15:29:33.000 eosio.token::transfer => tokenxchange 05fd45b6... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
我們可以在一個循環中調用它,處理每個確認的動作(以#開始的動作),直到我們耗盡事件或找到未確認的動作(以?開頭)。
$ cleos get actions tokenxchange3
# seq when contract::action => receiver trx id... args
================================================================================================================
機器可讀帳戶歷史記錄(JSON)
到目前為止,本教程著重介紹如何使用cleos來獲取並顯示歷史記錄。 但是,cleos僅僅是一個JSON-RPC介面的輕量級包裝器。 cleos可以轉儲從JSON-RPC請求返回的原始JSON,或者您可以創建自己的JSON-RPC請求。
這是查詢序列2時返回的JSON。
$ cleos get actions tokenxchange2-j
{
"actions": [{
"global_action_seq":2132,
"account_action_seq":2,
"block_num":2099,
"block_time":"2018-06-03T15:29:33.000",
"action_trace": {
"receipt": {
"receiver":"tokenxchange",
"act_digest":"3a49a62f23db41c4ed8a8fa52509a04056c8afdcb15de7544a430b2cadfbaf68",
"global_sequence":2132,
"recv_sequence":3,
"auth_sequence": [[
"scott",
9
]
],
"code_sequence":1,
"abi_sequence":1
},
"act": {
"account":"eosio.token",
"name":"transfer",
"authorization": [{
"actor":"scott",
"permission":"active"
}
],
"data": {
"from":"scott",
"to":"tokenxchange",
"quantity":"1.0000 SYS",
"memo":"12345"
},
"hex_data":"00000000809c29c2a0d8340df5a920cd10270000000000000453595300000000053132333435"
},
"elapsed":2,
"cpu_usage":,
"console":"",
"total_cpu_usage":,
"trx_id":"05fd45b61df815a4cdeb768e732adb292500b2399517fc9c98b6e6b136d7a4d1",
"inline_traces": []
}
}
],
"last_irreversible_block":2543
}
鑒於此JSON,如果其「block_num」
您可以通過以下方式識別不可逆轉的存款:
actions[].action_trace.act.account =="eosio.token"&&
actions[].action_trace.act.name =="transfer"&&
actions[].action_trace.act.data.quantity =="X.0000 SYS"&&
actions[].action_trace.to =="tokenxchange"&&
actions[].action_trace.memo =="KEY TO IDENTIFY INTERNAL ACCOUNT"&&
actions[].action_trace.receipt.receiver =="tokenxchange"&&
actions[].block_num
警告
驗證上述所有條件(包括令牌符號名稱)至關重要。 用戶可以通過「轉賬」操作創建其他合同,以「通知」您的賬戶。 如果您沒有驗證上述所有屬性,那麼您可能會處理「虛假存款」。
actions[].action_trace.act.account =="eosio.token"&&
actions[].action_trace.receipt.receiver =="tokenxchange"
驗證餘額
現在我們已經收到三筆存款,我們應該看到交易所的餘額為3.0000 SYS。
$ cleos get currency balance eosio.token tokenxchange SYS
3.0000SYS
處理提款
當用戶向您的交易所申請退出時,他們需要向您提供他們的eosio賬戶名稱和金額。 然後您可以運行cleos命令來執行提取。 cleos將與在nodeos上運行的「解鎖」錢包進行交互,該應用只能啟用本地主機連接。
假設scott想撤回1.0000 SYS:
$ cleos transfer tokenxchange scott"1.0000 SYS"
executed transaction:26a1d1f1601c35a1d97c294974ba26f3eea3b76f3c3df736c7bbab930df24c9f128bytes514us
# eosio.token
# tokenxchange
# scott
在這個階段,您的本地nodeos客戶端接受了該事務並可能將其廣播到更廣泛的網路。
我們可以獲取歷史記錄,並看到列出了三項新操作,所有操作都使用事務ID 26a1d1f1 ...,正如我們的傳輸命令所報告的那樣。 因為tokenxchange授權交易,所以會通知所有處理並接受轉賬的賬戶。 在這種情況下,合同eosio.token處理的轉移並更新餘額,發送者(tokenxchange)處理它,象接收器上(Scott)。 所有這三份合同/賬戶都基於該行動批准了它和/或進行了狀態轉換。
$ cleos get actions tokenxchange-1-9
# seq when contract::action => receiver trx id... args
================================================================================================================
# 0 2018-06-03T15:24:34.500 eosio.token::transfer => tokenxchange ce32ac1f... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
# 1 2018-06-03T15:28:12.000 eosio.token::transfer => tokenxchange 9d9f9816... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
# 2 2018-06-03T15:29:33.000 eosio.token::transfer => tokenxchange 05fd45b6... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
# 3 2018-06-03T15:37:35.500 eosio.token::transfer => tokenxchange 3d89c983... {"from":"scott","to":"tokenxchange","quantity":"1.0000 SYS",...
# 4 2018-06-03T15:38:44.500 eosio.token::transfer => tokenxchange f13ea506... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
# 5 2018-06-04T00:18:11.500 eosio.token::transfer => tokenxchange 95cbb1ce... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
# 6 2018-06-04T00:18:11.500 eosio.token::transfer => scott 95cbb1ce... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
# 7 2018-06-04T01:09:53.500 eosio.token::transfer => eosio.token 26a1d1f1... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
# 8 2018-06-04T01:09:53.500 eosio.token::transfer => tokenxchange 26a1d1f1... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
# 9 2018-06-04T01:09:53.500 eosio.token::transfer => scott 26a1d1f1... {"from":"tokenxchange","to":"scott","quantity":"1.0000 SYS",...
通過處理歷史記錄,我們可以在我們的交易確認時得到通知。在實踐中,我們希望您將保持私人資料庫狀態以跟蹤退出流程。為了映射到私有資料庫狀態,在撤銷請求中嵌入交換專用備忘錄可能很有用。另一種方法是簡單地為您的映射使用交易ID。當您的帳戶歷史記錄微服務遇到seq 5並且看到它不可逆轉時,它可以將您的提款標記為完成。
處理錯誤
有時,網路問題會導致事務失敗,並且永遠不會包含在塊中。您的內部資料庫需要知道何時發生,以便它可以通知用戶和/或再次嘗試。如果您在提交本地轉帳時沒有立即發生錯誤,則必須等待交易過期。每筆交易都有一個「到期」,之後交易永遠不能應用。一旦最後一個不可逆轉的塊超過了到期時間,您就可以安全地將您嘗試的提取標記為失敗,而不用擔心在最不經意的時候「浮動在以太」。
默認情況下,cleos會設置2分鐘的到期窗口。這足以讓所有21個生產者有機會包含交易。
$ cleos transfer tokenxchange scott"1.0000 SYS"-j -d
{
"expiration":"2018-06-04T00:36:39",
"ref_block_num":8209,
"ref_block_prefix":2405809535,
"max_net_usage_words":,
"max_cpu_usage_ms":,
"delay_sec":,
"context_free_actions": [],
...
你的微服務可以使用cleos來查詢最後一個不可逆塊號和區塊頭時間。
$ cleos get info
{
"server_version":"0961a560",
"chain_id":"cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
"head_block_num":8356,
"last_irreversible_block_num":8355,
"last_irreversible_block_id":"000020a3df1d1a2e963f8586347839bc9425d8b613c315fa7005e2336ec6b35a",
"head_block_id":"000020a4f9fb2371f04cd2c3cd05dbf63eb7005564d75abe787bd990b50f9348",
"head_block_time":"2018-06-04T00:37:22",
"head_block_producer":"producer2"
...
}
(Exchange)交易安全
本教程顯示最小可行的存款/提款處理程序,並假設一個包含授權存款和提款所需的所有密鑰的錢包。以安全為重點的交換將採取以下附加步驟:
將絕大部分資金保留在一個時間延遲,多重簽名控制賬戶
使用多個獨立流程/伺服器對熱錢包進行雙重檢查
部署一個自定義合同,只允許提款到KYC賬戶,並要求多重簽署白名單賬戶
部署一個只接受來自KYC賬戶的已知代幣存款的自定義合約
部署一個自定義合同,強制所有提款必須24小時等待
利用硬體錢包進行所有簽名,甚至自動取款
客戶希望立即取款,但他們也希望交易所受到保護。區塊鏈強制執行的24小時讓客戶知道資金「轉賬中」,同時通知潛在黑客,交易所有24小時響應未經授權的訪問。此外,如果交換電子郵件/簡訊用戶開始提款,用戶有24小時聯繫交易所並修復任何未經授權的訪問他們的個人帳戶。
TAG:鏈三豐 |