目錄
環境
- 開發環境:egret
- 瀏覽器:Chrome
- 錢包和賬號管理插件:Scatter
- 第三方庫依賴:eosjs
- 測試網:http://jungle.cryptolions.io/
- docker:https://www.docker.com/get-started
文檔/參考
- eos官方文檔
- EOS 智能合約
- eosjs: https://www.npmjs.com/package/eosjs
- EOS各種問題匯總,EOS入門必讀
- EOS開發調試環境搭建(全部流程)
- EOSIO開發(一)使用Docker構建本地環境
- 5分鐘學會cleos注冊EOS主網賬戶、投票和發幣
- 怎樣使用EOS.JS的API
- 如何安裝 EOS 網頁版錢包Scatter和使用指南
- 賬號管理
- EOS區塊鏈上EOSJS和scatter開發dApp
- Demo:eos-todo
- EOS教程如何創建EOS測試賬號并且使用SCATTER插件
- EOS內存即RAM如何買賣
合約與前端交互的解決方案
[圖片上傳失敗...(image-441895-1542722913474)]
賬號創建管理
賬號的創建和管理交給插件Scatter,玩家進入游戲的時候獲取賬號,如果沒有,則提示玩家創建賬號
前端調用合約方法
前端通過eos.contract
方法來調用合約方法,通過eos.getTableRows
方法來查詢調用結果
關于事件
由于eos合約不包含事件,因此采用輪詢的機制獲取表數據
另外客戶端調用合約方法,客戶端可以得到具體的結果,通過返回的正常調用結果來判斷方法調用是否成功
關于轉賬
eos 開發一個記錄轉賬信息的智能合約
EOS智能合約開發闖關(3)----合約內調用另一個合約的接口
[圖片上傳失敗...(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);
});
獲取Actions
:eos.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
端口
解決方案:
- 設置臨時變量
本地(官網例子)
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'
- 進入到
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插件
分析:
可能有幾個原因可以參考
- 端口號和IP配置不對
- 每次調用
action
時,未獲取Identity
- 調用
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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。