EOS實踐篇(轉載)

目錄

環境

文檔/參考

合約與前端交互的解決方案

[圖片上傳失敗...(image-441895-1542722913474)]

賬號創建管理

賬號的創建和管理交給插件Scatter,玩家進入游戲的時候獲取賬號,如果沒有,則提示玩家創建賬號

前端調用合約方法

前端通過eos.contract方法來調用合約方法,通過eos.getTableRows方法來查詢調用結果

關于事件

由于eos合約不包含事件,因此采用輪詢的機制獲取表數據

另外客戶端調用合約方法,客戶端可以得到具體的結果,通過返回的正常調用結果來判斷方法調用是否成功

關于轉賬

eos 開發一個記錄轉賬信息的智能合約
EOS智能合約開發闖關(3)----合約內調用另一個合約的接口

EOS 智能合約內部調用 EOS 幣轉賬功能

[圖片上傳失敗...(image-bcf84d-1542722913474)]



合約環境搭建

如果沒有安裝docker,請先安裝docker,下載地址 https://www.docker.com/get-started

eos環境搭建已經合約部署,參考eos官方文檔

eos常用命令

啟動eos服務

docker start eosio

設置臨時環境變量

alias cleos='docker exec -it eosio /opt/eosio/bin/cleos --url http://127.0.0.1:7777 --wallet-url http://127.0.0.1:5555'

進入eos控制臺

docker exec -it eosio bash

進入錢包shell

docker exec -it eosio bash

創建錢包

cleos wallet create -n <錢包名稱> --to-console

查詢錢包

 cleos wallet list

加鎖/解鎖錢包

cleos wallet lock/unclock -n 錢包名

打開關閉錢包

查詢不到任何錢包信息,說明此時所有錢包都是close狀態。

cleos wallet open/close

創建密鑰、導入密鑰

cleos create key

cleos wallet import ${private_key}

查詢密鑰

cleos wallet keys

創建賬戶

authorizing_account 是為創建賬戶這個動作提供資金的賬戶。在EOS中,創建賬戶時需要付出一點成本,這個成本由authorizing_account來承擔,在本文中使用默認的eosio賬戶。

new_account 被創建的賬戶。

owner_key 擁有new_account賬戶owner權限的公鑰。

active_key 擁有new_account賬戶active權限的公鑰。

 cleos create account ${authorizing_account} ${new_account} ${owner_key} ${active_key}
#cleos create account eosio hello EOS5FYZE9JAFkT4eDkAnHHyVpWzNsej5NXmQ2W1GxDsAWmeq3DQS7 -p eosio@active 
#cleos -u http://192.168.1.101:8888 create account eosio myaccount <public-key> <public-key> # 遠程連接到nodeos節點,創建myaccount賬戶

#  cleos -u http://127.0.0.1:7777 create account eosio ac1 EOS5FYZE9JAFkT4eDkAnHHyVpWzNsej5NXmQ2W1GxDsAWmeq3DQS7 
# cleos -u http://127.0.0.1:7777 create account eosio ac2 EOS8FAtsVeLZsyQmA9KFCX4pZ38gFsjhiiJ1UEcsDRzfb8YankjNR

  • 修改賬戶權限

    account 被修改權限的賬戶

    permission 被修改的權限,如果存在則修改,不存在則新增。

    authority 賬戶權限信息,定義權限擁有者(key、account)、權重(weight)、閾值(threshold)

    parent permission的父權限,可選項,默認active。

cleos set account permission ${account} ${permission} ${authority} ${parent}

  • 查看用戶信息
cleos -u http://127.0.0.1:7777  get account hello 

# cleos -u http://127.0.0.1:7777 get account ac1

eosjs的使用

連接


const Eos = require('eosjs')

var chain = {
    main: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', // main network
    jungle: '038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca', // jungle testnet
    sys: 'cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f' // local developer
}

var eos = Eos({
    keyProvider: '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3',// private key
    httpEndpoint: 'http://127.0.0.1:7777',
    chainId: chain.sys,

    broadcast: true,
    debug: false,
    sign: true
});

用于得到相應的區塊信息:getBlock(blockNumOrId)

eos.getBlock(1, (error, result) => {
    console.error(result);
})

// 獲取指定區塊信息
eos.getBlock({ block_num_or_id: 1 }).then(result => {
    console.log(result);
})

獲取信息:eos.getInfo

eos.getInfo({}).then(result => {
    console.log(result)
})

獲取賬號:getAccount(accountName)

eos.getAccount("ac1").then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});

返回信息

{ account_name: 'ac1',
  head_block_num: 76854,
  head_block_time: '2018-10-18T08:16:46.500',
  privileged: false,
  last_code_update: '1970-01-01T00:00:00.000',
  created: '2018-10-18T07:44:35.500',
  ram_quota: -1,
  net_weight: -1,
  cpu_weight: -1,
  net_limit: { used: -1, available: -1, max: -1 },
  cpu_limit: { used: -1, available: -1, max: -1 },
  ram_usage: 2724,
  permissions:
   [ 
     { perm_name: 'active', parent: 'owner', required_auth: [Object] },
     { perm_name: 'owner', parent: '', required_auth: [Object] } 
    ],
  total_resources: null,
  self_delegated_bandwidth: null,
  refund_request: null,
  voter_info: null 
}

account_name:這是EOS帳戶名。
ram_quota:持有的RAM量,單位字節。
net_limit:帳戶的總額、可用額、已用額,單位字節。
cpu_limit:CPU總量、可用CPU和已用CPU的總量,單位us。
ram_usage:帳戶使用的RAM量,單位字節。
total_resources:分配給自己的EOS資源。
self_delegated_bandwidth:自己的委托信息。
voter_info:有關投票的信息。留意staked部分,顯示我押注的數量。更具體地說,它的價值包括我委托給自己以及其他人委托的內容。

用于獲取公鑰對應的帳戶: getKeyAccounts(publicKey)

eos.getKeyAccounts('EOS5FYZE9JAFkT4eDkAnHHyVpWzNsej5NXmQ2W1GxDsAWmeq3DQS7')
    .then(result => console.log(result))
    .catch(error => console.error(error));

獲取賬號余額: getCurrencyBalance(code, account, symbol)

eos.getCurrencyBalance({
    account: 'bob',
    code: 'eosio.token',
    symbol: 'SYS'
})
    .then(result => console.log(result))
    .catch(error => console.error(error));

#命令: cleos -u http://127.0.0.1:7777  get currency balance eosio.token bob SYS

獲取賬號狀態: getCurrencyStats(code, symbol)

eos.getCurrencyStats('eosio.token', 'SYS')
    .then(result => console.log(result))
    .catch(error => console.error(error));
#命令: cleos -u http://127.0.0.1:7777 get currency stats eosio.token SYS

獲取ABI: eos.getAbi(account_name)

eos.getAbi({ account_name: "eosio" }).then(result => {
    console.log(JSON.stringify(result));
}).catch(err => {
    console.error(err);
});

獲取Actionseos.getActions(account_name, pos, offset)

pos和offset是指:從第pos條記錄開始獲取offset條Actions

eos.getActions({ account_name: "eosio", pos: 0, offset: 15 }, (error, result) => {
    if (error) {
        console.error(error);
    }
    if (result) {
        console.log(result);
    }
}); 

Scatter方法調用

依賴eosjs: https://cdn.jsdelivr.net/npm/eosjs@16.0.9/lib/eos.min.js

獲取

var scatter = window['scatter'];
if (!scatter) return;
scatter.requireVersion(3.0);

window['scatter'] = null;

初始化eos

var config = {
        NETWORK_HOST: "dev.cryptolions.io",
        NETWORK_PORT: 38888,
        PROTOCAL: "http",
        CHAINID: "038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca"
    }

const host = config.NETWORK_HOST;
const port = config.NETWORK_PORT;
const network = { blockchain: 'eos', host: config.NETWORK_HOST, port: config.NETWORK_PORT, protocol: config.PROTOCAL, chainId: config.CHAINID };

const eosOptions = {};
const eos = scatter.eos(network, Eos, eosOptions, config.PROTOCAL);

獲取賬號

state.scatter.getIdentity({
    accounts: [eosNetwork]
}).then(res => {
    if (!res) return ;
    var identity = res;
    ...
}).catch(e => {
    console.log(e)
});

退出賬號

scatter.forgetIdentity();

部署時遇到的問題

1. 在哪里獲取EOS

注冊:http://jungle.cryptolions.io/#account

獲取代幣:http://jungle.cryptolions.io/#faucet

2. cleos命令提示連接不到18888端口

解決方案:

  1. 設置臨時變量

本地(官網例子)

alias cleos='docker exec -it eosio /opt/eosio/bin/cleos --url http://127.0.0.1:7777 --wallet-url http://127.0.0.1:5555'

測試網

alias cleos='docker exec -i keosd /opt/eosio/bin/cleos  --wallet-url http://127.0.0.1:8900  -u http://dev.cryptolions.io:38888'

  1. 進入到eosio控制臺,以本地為例

-u <IP>即可

docker exec -it eosio bash

# cleos -u http://127.0.0.1:7777  get info

3. 設置合約的時候提示找不到路徑

原因:在docker中沒有該文件

解決方法:以賬號test,合約hello為例

cd <項目目錄>/todo
eosio-cpp -o hello.wasm hello.cpp --abigen

# 查看容器id

docker inspect -f '{{.ID}}' eosio

#將顯示<ID>

docker cp <項目路徑>/hello/ 488a19c71a50068fc91844b79fc1f97baf600c492c6e173832d7099ef53f6849:Users/<用戶名稱>/eosio-wallet/contracts/

# 設置合約
cleos set contract test /Users/<用戶名稱>/eosio-wallet/contracts/hello -p test@active

4. 部署合約提示ram不足

解決方案購買ram,購買方和接收方可以是同一個賬號

 cleos system buyram -k <購買方> <接收方> 102

5. 如何調用eosjs和Scatter轉賬

調用eosjs轉賬

以本地為例

方法1:

eos.transaction(
    {
        // ...headers,
        // context_free_actions: [],
        actions: [
            {
                account: 'eosio.token',
                name: 'transfer',
                authorization: [{
                    actor: 'eosio',
                    permission: 'active'
                }],
                data: {
                    from: 'eosio',
                    to: 'bob',
                    quantity: '1.0000 SYS',
                    memo: 'ggg'
                }
            }
        ]
    },
    { broadcast: true, sign: true }
    // config -- example: {broadcast: false, sign: true}
).then(res => {
    console.log(res);
}).catch(err => {
    console.log(err);
})

方法2:

eos.contract("eosio.token").then(contract => {
    contract.transfer("alice", "bob", "1.000 SYS", {
        authorization: [
             {
                actor: "eosio",
                 permission: "active"
            }
        ]
    }).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    });
}).catch(err => {
    console.log(err);
});

調用Scatter轉賬

以測試網為例

var config = {
        NETWORK_HOST: "dev.cryptolions.io",
        NETWORK_PORT: 38888,
        PROTOCAL: "http",
        CHAINID: "038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca"
    }

var eosNetwork =  { blockchain: 'eos', host: config.NETWORK_HOST, port: config.NETWORK_PORT, protocol: config.PROTOCAL, chainId: config.CHAINID }

#獲取scatter

var scatter = window['scatter'];
    if (!scatter) return;
    scatter.requireVersion(3.0);

這里注意要引入eosJs才行
var eos = scatter.eos(eosNetwork, Eos, {}, config.PROTOCAL);

window['scatter'] = null;

scatter.getIdentity({
    accounts: [eosNetwork]
}).then(res => {
    if (!res) return ;

    var identity = res ? res.accounts.find(account => account.blockchain === 'eos') : undefined;

    var to = "<代幣接收方賬號>";
    var currency = "EOS";//代幣
    var memo = "備注";

    eos.transaction({
        actions: [
            {
                account: 'eosio.token',
                name: 'transfer',
                authorization: [{
                    actor: identity.name,
                    permission: identity.authority
                }],
                data: {
                    from: identity.name,
                    to: to,
                    quantity: currency,//注意 要4位小數
                    memo: memo
                }
            }
        ],
        { broadcast: true, sign: true }
    }).then(()=>{
        //轉賬成功
    }).catch(err=>{
        console.log(err);

        //轉賬失敗
    })

}).catch(e => {
    console.log(e)
});

6. 如何獲取Scatter插件

看上面例子

7. 我想把合約部署到測試網

參考:https://zhuanlan.zhihu.com/p/37891815

步驟1

docker stop keosd
docker rm keosd
docker start keosd

docker run -d --restart=unless-stopped --name keosd   \
  -v /Users/<用戶名>/<項目>/eosio-wallet:/opt/eosio/bin/data-dir  \
  -v /Users/<用戶名>/<項目>/eosio-wallet:/Users/<用戶名>/eosio-wallet \
  -t eosio/eos /opt/eosio/bin/keosd  \
  --wallet-dir /opt/eosio/bin/data-dir \
  --http-server-address=127.0.0.1:8900 

這是Mac上的例子,linux參考 https://zhuanlan.zhihu.com/p/37891815 ,
Window則把上面帶用戶名的路徑替換,沒有嘗試過

步驟2

alias cleos='docker exec -i keosd /opt/eosio/bin/cleos  --wallet-url http://127.0.0.1:8900  -u http://dev.cryptolions.io:38888'

這樣就連接到測試網了

接下來創建賬號以及設置合約,參考官方文檔:https://developers.eos.io/eosio-home/docs

8. 為啥我調不起Scatter插件

分析:

可能有幾個原因可以參考

  1. 端口號和IP配置不對
  2. 每次調用action時,未獲取Identity
  3. 調用eos.contract時設置得權限不匹配

其實最主要原因是權限設置不正確,其次初始化時const eos = scatter.eos(network, Eos, eosOptions, config.PROTOCAL);:如果這一步參數設置不正確,后面調用轉賬等活動是會報錯

其中ChainID測試網(jungle)為:038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca,

本地為:cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f

另外使用Scatter不需要填寫keyProvider,如果單純用eosjs,則需要

var chain = {
    main: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', // main network
    jungle: '038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca', // jungle testnet
    sys: 'cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f' // local developer
}

var eos = Eos({
    keyProvider: '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3',
    httpEndpoint: 'http://127.0.0.1:7777',
    chainId: chain.sys,
    expireInSeconds: 60,
    broadcast: true,
    debug: false,
    sign: true
});

9. 我看了這么多,還是不知道如何該如何下手,有一個簡單的教程嗎

官方文檔:https://developers.eos.io/eosio-home/docs

看官方文檔足夠了

注意有提交內容的地方,需要將項目目錄或者是要填寫上去,文檔會做出相應的修改

作者:隕石墜滅
鏈接:http://www.lxweimin.com/p/cb9d44185c6c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 目錄 環境 文檔/參考 合約與前端交互的解決方案 合約環境搭建 eosjs的使用 Scatter方法調用 部署時遇...
    隕石墜滅閱讀 3,186評論 2 5
  • EOS 資源匯總 A curated list of EOS Ecosystem by [SuperONE](ht...
    shenciyou閱讀 3,972評論 0 21
  • 1,摘要 【本文目標】本文列出經常EOS環境經常會使用的命令格式以及樣例,作為EOS命令的快速查找手冊。不管是EO...
    豪斯說閱讀 1,208評論 0 0
  • 容入文人墨客之中,越發顯得自身的微渺。我的筆沒那么靈動,不能妙筆生輝。卻仍在默默耕耘,它在傾吐著心聲它在書寫著人生...
    隨緣_4c40閱讀 135評論 0 0
  • “你認為人生中最重要的是什么?”德家相信這是不少朋友被問到的一個問題。如果是你,打算怎么回答呢? 重要的東西有很多...
    qiankou695閱讀 130評論 0 0