EOS區塊鏈錢包開發教程

 

在幣圈流行着這樣一句話:錢包是區塊鏈的入口,猶如瀏覽器是互聯網的入口。區塊鏈錢包是什麼呢?一些人會脫口而出相似於微信支付寶錢包唄,其實區塊鏈錢包並不存儲加密貨幣,加密貨幣其實都放在鏈上。錢包只是個公私鑰的管理工具而已,同時它也具備貨幣可進行交易的特性,也就是收款和付款。區塊鏈錢包的應用價值,不只體如今資產管理上,更體現於支付、交易以及DApp市場上。json

號稱能實現百萬TPS的EOS擁有着龐大的用戶羣體,自從2018年6月10日衆籌結束主網上線以來,截止筆者發稿時,它的註冊賬戶已經超過188萬,再加上那些沒有EOS帳戶卻在加密貨幣交易平臺上持有EOS代幣的用戶數,能夠想象下這個總用戶數。瀏覽器

 

區塊鏈錢包擔當加密貨幣資產的存儲和DApp的超級流量入口,它的市場需求也隨之增長,怎麼進行EOS區塊鏈錢包開發呢?安全

一、建立錢包服務器

描述:建立新錢包微信

請求示例:curl

$ curl http://localhost:8888/v1/wallet/create -X POST -d '"default"'工具

參數:區塊鏈

返回數據:微信支付

PW5KFWYKqvt63d4iNvedfDEPVZL227D3RQ1zpVFzuUwhMAJmRAYyXui

 

數聽說明:

新錢包的密碼,用於解鎖該錢包

 

 

二、打開錢包

描述:錢包的默認狀態爲關閉,只有打開錢包的狀態下才能進行後面的操做

請求示例:

$ curl http://localhost:8888/v1/wallet/open-X POST -d '"default"'

參數:

 

返回數據獲得:

{}

 

三、鎖定錢包

描述:對給定的錢包進行鎖定

請求示例:

$ curlhttp://localhost:8888/v1/wallet/lock -X POST -d '"default"'

參數:

 

 

返回數據:

{}

 

四、鎖定全部錢包

描述:對本地全部錢包進行鎖定

請求示例:

$ curlhttp://localhost:8888/v1/wallet/lock_all

返回數據:

{}

 

五、解鎖錢包

描述:對給定的錢包進行解鎖操做

請求示例:

$ curl http://localhost:8888/v1/wallet/unlock-X POST -d '["default", "PW5KFWYKqvt63d4iNvedfDEPVZL227D3RQ1zpVFzuUwhMAJmRAYyX"]'

參數:

 

 

 

返回數據:

{}

 

六、錢包導入私鑰

描述:在給定的錢包裏導入一個私鑰

請求示例:

$ curlhttp://localhost:8888/v1/wallet/import_key -X POST -d '["default","5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"]'

參數:

 

 

 

返回數據:

{}

 

七、列出錢包

描述:列出本地打開的全部錢包

請求示例:

$ curl http://localhost:8888/v1/wallet/list_wallets

參數:

返回數據:

["default *"]

數聽說明:

*意味着解鎖的錢包

 

八、獲取公鑰列表

描述:將本地全部錢包中全部帳號的公鑰列出

請求示例:

curl http://localhost:8888/v1/wallet/get_public_keys

參數:

返回數據:

["EOS5Dz1qfz9H5cmoofUC5h2ticeNgPUAjKsWK7EWySsEDs7m8iNTw","EOS5o9u5hPF3yWceYDwvJvXdqBvEAzUETW4jzL8oJpRk7XaYRbZTZ","EOS6ERAj2QTzExko3qe3hbReQAPPhsQmqHE9nszC172kXFceoJnu7"]

數聽說明:

 

九、設置錢包自動上鎖

描述:在設定的時間內(以秒爲單位),錢包自動鎖定

請求示例:

curl http://localhost:8888/v1/wallet/set_timeout -X POST -d '10'

參數:

 

 

 

 

返回數據:

{}

 

十、交易簽名

curl http://localhost:8888/v1/wallet/sign_transaction-X POST -d '[{

                 "ref_block_num":21453,

                 "ref_block_prefix":3165644999,

                 "expiration":"2017-12-08T10:28:49",

                 "scope":["initb", "initc"],

                 "read_scope":[],

                 "messages":[{

                         "code":"currency",

                         "type":"transfer",

                         "authorization":[{

                                  "account":"initb",

                                  "permission":"active"

                         }],

                         "data":"000000008093dd74000000000094dd74e803000000000000"

                }],

                 "signatures":[]

        },

        ["EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"],""

]’

對交易信息和智能合約進行查看,找到與此數據相關數據

 

十一、獲取最新區塊信息

描述:獲取最新區塊信息

請求示例:

curlhttp://127.0.0.1:8888/v1/chain/get_info

參數:

返回數據:

{

"server_version":"b2eb1667",

"head_block_num":259590,

"last_irreversible_block_num":259573,

"head_block_id":"0003f60677f3707f0704f16177bf5f007ebd45eb6efbb749fb1c468747f72046",

"head_block_time":"2017-12-10T17:05:36",

"head_block_producer":"initp",

"recent_slots":"1111111111111111111111111111111111111111111111111111111111111111",

"participation_rate":"1.00000000000000000"

}

數聽說明:

head_block_num:意味着區塊高度,第一個區塊爲1,依次累加

last_irreversible_block_num:表明上一個不可逆轉的區塊高度(通常和當前區塊間隔14以上)

head_block_id:區塊id

head_block_producer:打包此區塊的節點

 

十二、查詢區塊

 

描述:經過給定的區塊高度或區塊id獲得指定區塊信息

請求示例:

$ curl http://127.0.0.1:8888/v1/chain/get_block -X POST -d'{"block_num_or_id":5}'

$ curlhttp://127.0.0.1:8888/v1/chain/get_block -X POST -d'{"block_num_or_id":0000000445a9f27898383fd7de32835d5d6a978cc14ce40d9f327b5329de796b}'

 

參數:

區塊高度/區塊id

返回數據:

{

    "previous":"0000000674814e01a617ea58921f1e347b9904bd8b61c16de5d4efc73b5bd674",

    "timestamp":"2018-05-05T00:05:22",

    "transaction_merkle_root":"0000000000000000000000000000000000000000000000000000000000000000",

    "producer": "inith",

    "producer_changes":[],

    "producer_signature":"20121bd1010967fdc4839806250855652282106efbb3b16dfa768b9369f4fd5e2b011d742c8bfd61321b90c9282f1ecb33b6e9a6969a30ee8330a589065e05d910",

    "cycles": [],

    "id":"00000007103c0be2b7fa5710a3f92f4e740ccc1e5b5e201e49b4b776d599168d",

    "block_num": 7,

    "ref_block_prefix":274201271

}

接下來對數據進行說明:

previous:父區塊id

Timestamp:產生時間

transaction_merkle_root:默克爾根節點

Producer:生產節點

producer_signature:生產節點簽名

producer_changes:生產者列表的變化

Id:區塊id

block_num:區塊高度

ref_block_prefix:引用的區塊前綴

 

1三、獲取帳號信息

 

描述:經過帳號獲得帳號詳情

請求示例:

$ curlhttp://127.0.0.1:8888/v1/chain/get_account -X POST -d'{"account_name":"inita"}'

參數:

帳號名

返回數據:

{

    "account_name": "inita",

    "eos_balance": "999999.9992 EOS",

    "staked_balance": "0.0000EOS",

    "unstaking_balance":"0.0000 EOS",

    "last_unstaking_time": "1969-12-31T23:59:59",

    "permissions": [{

        "perm_name": "active",

        "parent": "owner",

        "required_auth": {

           "threshold": 1,

           "keys": [{

               "key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",

               "weight": 1

           }],

           "accounts": []

        }

    }, {

        "perm_name": "owner",

        "parent": "",

        "required_auth": {

           "threshold": 1,

           "keys": [{

               "key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",

               "weight": 1

           }],

           "accounts": []

        }

    }]

}

數聽說明:

eos_balance:帳戶的eos餘額

Permissions:指權限設定,inita帳號有2個權限,一個是active另外一個是owner,owner爲擁有者,一樣是active的父權限,通常操做由active權限進行執行,owner可以用來恢復active

Threshold:閾值

Weight:權重,假如權重達到閾值時,纔有權限操做

Key:公鑰

 

1四、獲取智能合約

 

描述:獲取智能合約

請求示例:

curlhttp://127.0.0.1:8888/v1/chain/get_code -X POST -d '{"account_name":"currency"}'

參數:

智能合約名(也就是部署此智能合約的名字,他們都用currency這個名字)

返回數據:

{

       "name":"currency",

       "code_hash":"a1c8c84b4700c09c8edb83522237439e33cf011a4d7ace51075998bd002e04c9",

       "wast":"(module\n  (type $0 (func (parami64 i64 i32) (result i32)))\n ...truncated",

       "abi":{

               "types":[{

                        "new_type_name":"account_name",

                        "type":"name"

               }],

               "structs":[{

                        "name":"transfer",

                        "base":"",

                        "fields":[{

                                        "name":"from",

                                        "type":"account_name"

                                },

                                {

                                        "name":"to",

                                        "type":"account_name"

                                },

                                {

                                        "name":"quantity",

                                        "type":"uint64"

                                }

                        ]

               },{

                        "name":"account",

                        "base":"",

                        "fields":[{

                                        "name":"key",

                                        "type":"name"

                                },

                                {

                                        "name":"balance",

                                        "type":"uint64"

                                }

                        ]

               }],

               "actions":[{

                        "name":"transfer",

                        "type":"transfer"

               }],

               "tables":[{

                        "name":"account",

                        "type":"account",

                        "index_type":"i64",

                        "key_names":["key"],

                        "key_types":["name"]

               }]

       }

數聽說明:

這個智能合約currency是部署在currency帳號上面,主要功能是交易」transfer」

 

 

1五、get_table_rows

 

描述:得到指定帳號在智能合約上的數據

請求示例:

$ curl http://127.0.0.1:8888/v1/chain/get_table_rows -XPOST -d '{"scope":"inita","code":"currency", "table":"account","json": true}'

$ curl http://127.0.0.1:8888/v1/chain/get_table_rows -XPOST -d '{"scope":"inita","code":"currency", "table":"account","json": true, "lower_bound":0, "upper_bound":-1,"limit":10}'

參數:

Scope:表明賬戶名

Code:智能合約名

Table:表明表名

Json:是否以json格式顯示

 

返回數據:

{

"rows": [{

"key": "account",

"balance": 1000

}],

"more": false

}

數聽說明:

Key:表名

Balance:所查詢帳戶餘額

 

1六、json轉16進制

描述:經過把json序列化,產出結果經常使用爲交易中的參數

請求示例:

$ curlhttp://127.0.0.1:8888/v1/chain/abi_json_to_bin -X POST -d'{"code":"currency","action":"transfer","args":{"from":"currency","to":"inita", "quantity":100}}'

參數:

Code:智能合約名

action:智能合約中的規定動做,transfer爲轉帳動做

initb帳戶向initc帳戶轉帳1000

返回數據:

{"binargs":"000000008093dd74000000000094dd74e803000000000000","required_scope":[],"required_auth":[]}

數聽說明:

 

1七、16進制轉json

描述:

將上面獲得的結果反序列化

請求示例:

$ curl http://127.0.0.1:8888/v1/chain/abi_bin_to_json-X POST -d '{"code":"currency","action":"transfer","binargs":"000000008093dd74000000000094dd74e803000000000000"}'

參數:

Code:智能合約名

action:智能合約中的規定動做,transfer是轉帳動做

Json:是否以json格式顯示

 

返回數據:

{

"args": {

"from": "initb",

"to": "initc",

"quantity": 1000

},

"required_scope": [],

"required_auth": []

}

數聽說明:

 

1八、發送交易

這種方法須要一條json格式的交易信息,接着會嘗試將交易在鏈上執行。

響應:

成功即會返回 HTTP200和交易id

{

'transaction_id' : "..."

}

交易其實是在本地發送的,並不表明交易已經上鍊。

假如發生錯誤會返回http400(無效的參數)或500(內部服務器錯誤)

HTTP/1.1 500 Internal Server Error

Content-Length: 1466

...error message...

請求示例:

接下來的示例假定了一條轉帳操做,此時的ref_block_num和ref_block_prefix是 「/v1/chain/get_block +上一個不可逆的區塊」提供的結果. 你還要使用 /v1/wallet/sign_transaction得到正確的簽名

curl http://localhost:8888/v1/chain/push_transaction -X POST -d'{"ref_block_num":10975,"ref_block_prefix":2385262967,"expiration":"2018-05-10T17:26:21","scope":["currency","inita"],"messages":[{"code":"currency","type":"transfer","recipients":["currency","inita"],"authorization":[{"account":"currency","permission":"active"}],"data":"0000001e4d75af46000000000093dd746400000000000000"}],"signatures":["1f7088ee47102461c2e1e25f7e17034802c3d067e82c5e02b81951199a00e7dbe74018f7c3a3d5eac9a89e30cde3b7705add8ebccf7b50f3675d60789b3a2ca7f5"],"authorizations":[]}'

 

1九、發送多條交易

請求示例:

curl http://localhost:8888/v1/chain/push_transaction -XPOST -d '[{"ref_block_num":10975,"ref_block_prefix":2385262967,"expiration":"2018-05-10T17:26:21","scope":["currency","inita"],"messages":[{"code":"currency","type":"transfer","recipients":["currency","inita"],"authorization":[{"account":"currency","permission":"active"}],"data":"0000001e4d75af46000000000093dd746400000000000000"}],"signatures":["1f7088ee47102461c2e1e25f7e17034802c3d067e82c5e02b81951199a00e7dbe74018f7c3a3d5eac9a89e30cde3b7705add8ebccf7b50f3675d60789b3a2ca7f5"],"authorizations":[]}, {"ref_block_num":10975,"ref_block_prefix":2385262967,"expiration":"2018-05-10T17:26:21","scope":["currency","initb"],"messages":[{"code":"currency","type":"transfer","recipients":["currency","initb"],"authorization":[{"account":"currency","permission":"active"}],"data":"0000001e4d75af46000000008093dd746400000000000000"}],"signatures":["1f7088ee47102461c2e1e25f7e17034802c3d067e82c5e02b81951199a00e7dbe74018f7c3a3d5eac9a89e30cde3b7705add8ebccf7b50f3675d60789b3a2ca7f5"],"authorizations":[]}]'

 

20、獲取所需key

Getrequired keys to sign a transaction from list of your keys.

在列表裏獲得到簽署一條交易所需的key

請求示例:

curl http://localhost:8888/v1/chain/get_required_keys-X POST -d '{"transaction":{"ref_block_num":"100","ref_block_prefix":"137469861","expiration":"2017-09-25T06:28:49","scope":["initb","initc"],"actions":[{"code":"currency","type":"transfer","recipients":["initb","initc"],"authorization":[{"account":"initb","permission":"active"}],"data":"000000000041934b000000008041934be803000000000000"}],"signatures":[],"authorizations":[]},"available_keys":["EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq","EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA","EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"]}'

返回數據:

{

"required_keys": [

"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"

]

}

如今通常的交易所都不會本身去單獨開發一套錢包系統了。 不只由於比特幣以太坊等區塊節點數據龐大,同步傳輸慢,並且在服務器和帶寬的花費成本比較高。最重要的是養不起這樣的一個技術團隊!原生錢包這種私鑰放在服務器很是不安全,被偷就涼涼了。

相關文章
相關標籤/搜索