风险提示:理性看待区块链,提高风险意识!
EOS钱包开发 :EOS代币转账交易
首页 > 币界资讯 > 区块链知识 2018-11-14 10:45:00

一、使用Cleos在本地网络发布代币

发布代币后转账给钱包应用里的账号,接下来我们才能使用应用程序去进行转账交易。发布代币的过程这里使用Cleos命令行工具,咱们拓展钱包应用程序的时候也可以添加发布代币这样一个功能,这里就不做这个次要的功能了。

1. 部署eosio.token合约

这一步骤咱们在环境搭建章节已经完成,注意必须创建eosio.token这个账号,并使用eosio.token账号部署eosio.token合约。

2. 创建Token代币

contracts/eosio.token/eosio.token.hpp文件中可以查看到Token合约接口,如下

32A41D3B0DFBCA95B7761C2490703234

需要调用create()方法去创建Token合约。发行人可以对该Token合约执行一些特有的操作,例如冻结,召回和列入所有者白名单。

创建代币的cleos命令是cleos push action

lixu@ubuntu:~/Desktop/sourceeos/eos$ cleos push action
ERROR: RequiredError: account
Push a transaction with a single action
Usage: cleos push action [OPTIONS] account action data

Positionals:
  account TEXT                The account providing the contract to execute (required)
  action TEXT                 A JSON string or filename defining the action to execute on the contract (required)
  data TEXT                   The arguments to the contract (required)

Options:
......

其中的参数:

  • account TEXT(必传):执行合约的帐户名。
  • action TEXT (必传):JSON字符串或文件名,执行的是合约里的action,即方法名。
  • data TEXT(必传):执行的是合约方法的参数。

因此,创建EOS Token代币的完整命令如下:

cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS"]' -p eosio.token@active
或者调用create方法时指定参数
cleos push action eosio.token create '{"issuer":"eosio", "maximum_supply":"1000000000.0000 EOS"}' -p eosio.token@active

executed transaction: b1a1f0a1471415170438ea609ed6586ec7d3965e9bcd4f92cb502364f877fa59  120 bytes  494 us
#   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS"}

此命令是通过eosio.token账户创建了一个新的Token,发布者是eosio,Token名为EOS,其精度为4位小数,发布的总量是1000000000.0000 EOS。

3. 查询代币信息

根据命令cleos get currency stats可以查看查询代币命令的参数

lixu@ubuntu:~$ cleos get currency stats

ERROR: RequiredError: contract
Retrieve the stats of for a given currency
Usage: cleos get currency stats contract [symbol]

Positionals:
  contract TEXT               代币合约名称 ,此项必填
  symbol TEXT                 代币符号,例如 EOS ,此项必填
因此,可知查询账户余额的命令为 cleos get currency stats 合约名称 代币符号
lixu@ubuntu:~$ cleos get currency stats eosio.token EOS
{
  "EOS": {
    "supply": "0.0000 EOS",
    "max_supply": "1000000000.0000 EOS",
    "issuer": "eosio"
  }
}

4. 发行者转代币给其它账户

现在我们已经创建了EOS代币,发行者可以调用issue方法向之前创建的帐户lixu发放Token。

cleos push action eosio.token issue '[ "user", "100.0000 EOS", "memo" ]' -p eosio@active
可以看到会通知资金的发送方和接收方,以便它们可以自动处理存款和取款。

5. 查询账户余额

根据命令cleos get currency balance可以查询账户余额。

$ cleos get currency balance

ERROR: RequiredError: contract
Retrieve the balance of an account for a given currency
Usage: cleos get currency balance contract account [symbol]

Positionals:
  contract TEXT               代币合约名称
  account TEXT                查询余额的账户
  symbol TEXT                 货币符号,例如 EOS ,此项非必须
因此,查询账户余额完整的命令为cleos get currency balance 合约名称 账户名称
lixu@ubuntu:~$ cleos get currency balance eosio.token lixu
100.0000 EOS

lixu@ubuntu:~$ cleos get currency balance eosio.token lixu EOS
100.0000 EOS

二、项目源码

对发布的代币如何进行转账交易,请查看“深入浅出EOSJS:连接到主网、测试网、交易”章节。

1. web.js

编辑controllers文件夹下的web.js文件,用于实现后端返回给前端转账交易的页面。

module.exports = {
    ......

    getTransactionHtml:async(ctx) => {
        await ctx.render("transaction.html")
    },
}

2. transaction.js

在controllers文件夹下新建transaction.js文件,后端实现转账交易的功能。

let {success, fail} = require("../utils/myUtils")
let myUtils = require("../utils/myUtils")
let walletModel = require("../models/wallet")

module.exports = {
    transactionSend: async (ctx) => {
        console.log(ctx.request.body)
        let { from, to, amount, symbol, memo, wallet, password } = ctx.request.body

        //1.获取钱包里面所有的私钥
        let privatekeyList = await walletModel.getWalletPrivatekeyList(wallet, password)

        //2.配置EOSJS
        eos = myUtils.getEOSJS(privatekeyList)

        //3.发起转账交易
        options = {
            authorization: `${from}@active`,
            broadcast: true,
            sign: true
        }
        let data = await eos.transaction(eos => {
            let stantardAmount = parseFloat(amount).toFixed(4)
            eos.transfer(from, to, `${stantardAmount} ${symbol}`, memo, options)
        })
        console.log("data:", data)

        //4.返回给前端执行的状态
        let resData
        if (data) {
            resData = success("转账成功")
        } else {
            resData = fail("转账失败")
        }
        ctx.body = resData
    },
}

3. wallet.js

在mdoels文件夹下新建wallet.js文件,实现根据钱包名和密码获取所有秘钥的功能。

let httpRequest = require("../utils/httpRequest")
let config = require("../config/config")

module.exports = {
    getWalletPrivatekeyList: async (wallet, password) => {
        let privatekeyList = []
        let res = await httpRequest.postRequest(config.walletGetKeys, [wallet, password])
        if (res.code == 0 && res.data.length > 0) {
            for (const index in res.data) {
                let keys = res.data[index]
                privatekeyList.push(keys[1])
            }
        }
        return privatekeyList
    }
}

3. router.js

将转账交易功能的接口绑定到路由。

......

let transactionController = require("../controllers/transaction")

//转账交易
router.post("/transaction/send", transactionController.transactionSend)

//页面
router.get("/transaction.html", webController.getTransactionHtml)

4. transaction.html

在views文件夹下新建transaction.html文件,实现前端转账交易的页面。

<html>

<head>
    <title>转账</title>
    <script src="js/lib/jquery-3.3.1.min.js"></script>
    <script src="/js/lib/jquery.url.js"></script>
    <script src="js/transaction.js"></script>
    <link rel="stylesheet" href="css/eoswallet.css">
</head>

<body>
    <%include block/nav.html%>

    <div id="main">
        <h1></h1>
        <div class="row top">
            <form id="transaction-send-form"  >
                <select name="from" id="transaction-send-account-select">
                </select>
                <label>from账号名称</label>
                <br><br>

                <input type="text" name="to" placeholder="请输入对方账号名称">
                <label>to账号名称</label>
                <br><br>

                <input type="text" name="amount" placeholder="请输入转账数量">
                <select name="symbol" id="transaction-send-token-select">
                </select>
                <label>金额</label>
                <br><br>

                <input type="text" name="memo" placeholder="请输入转账备注">
                <label>memo备注</label>
                <br><br>
                <input type="text" name="wallet" hidden="hidden">
                <input type="text" name="password" hidden="hidden">
                <button type="submit">发送交易</button>
            </form>
        </div>

        <div class="row top">
            <table>
                <tr>
                    <th>代币</th>
                    <th>金额</th>
                </tr>
            </table>
            <table id="transation-balance-table">
            </table>
        </div>
    </div>
</body>

</html>

5. transaction.js

在static/js文件夹下新建transaction.js文件,前端处理钱包模块的网络请求与页面的渲染。

//账号金额
function updateAccountBalance(account) {
    let params = {"code":"eosio.token","account":account}
    $.post("/account/balance", params, function (res, status) {
        console.log(status + JSON.stringify(res))
        if (res.code == 0) {
            let balanceTable = $("#transation-balance-table")
            balanceTable.empty()
            if (res.data && res.data.length > 0) {
                res.data.forEach(balanceData => {
                    let balanceTr = `<tr>
                        <td>${balanceData.symbol}</td>
                        <td>${balanceData.amount}</td>
                    </tr>`
                    balanceTable.append(balanceTr)
                });
                tokenSelectList(res.data)
            } else {
                let balanceTr = `<tr>
                        <td>无存款</td>
                    </tr>`
                balanceTable.append(balanceTr)
                tokenSelectList([])
            } 
        }
    })
}

//选择Token列表
function tokenSelectList(tokenList) {
    let TokenSelectList = $("#transaction-send-token-select")
    TokenSelectList.empty()

    for(let i = 0; i < tokenList.length; i++) {
        let token = tokenList[i]
        let option = `<option value="${token.symbol}">${token.symbol}</option>`
        TokenSelectList.append(option)
    }
}

$(document).ready(function () {
    let currentwallet = localStorage.getItem("currentwallet")
    $("h1").text(currentwallet+" 钱包")
    if (!currentwallet) {
        return
    }
    let currentAccount = localStorage.getItem("currentAccount")
    let walletPassword = localStorage.getItem(currentwallet)

    $("input[name=wallet][hidden=hidden]").val(currentwallet)
    $("input[name=password][hidden=hidden]").val(walletPassword)

    //选择账号列表
    let accountList = sessionStorage.getItem(`wallet-${currentwallet}-accounts`)
    accountList = JSON.parse(accountList)
    console.log("accountList",accountList)
    let accountSelectList = $("#transaction-send-account-select")
    for(let i = 0; accountList && i < accountList.length; i++) {
        let account = accountList[i]
        let accountOption
        if (account == currentAccount) {
            accountOption = `<option selected="selected" value="${account}">${account}</option>`
        } else {
            accountOption = `<option value="${account}">${account}</option>`
        }
        accountSelectList.append(accountOption)
    }

    //账号金额
    updateAccountBalance(currentAccount)

    //选择不同的账号
    accountSelectList.change(function() {
        console.log(this.value)
        localStorage.setItem("currentAccount", this.value)
        updateAccountBalance(this.value)
    })

    //发送交易
    $("#transaction-send-form").validate({
        rules: {
            from: {required: true,},
            to: {required: true,},
            amount: {required: true,},
        },
        messages: {
            frmo: {required: "请选择转出的账号",},
            to: {required: "请输入对方账号名称",},
            amount: {required: "请输入转账的数量",},
        },
        submitHandler: function (form) {
            $(form).ajaxSubmit({
                url: "/transaction/send",
                type: "post",
                dataType: "json",
                success: function (res, status) {
                    console.log(status + JSON.stringify(res))
                    alert(JSON.stringify(res.data))
                    if (res.code == 0) {
                    }
                },
                error: function (res, status) {
                    console.log(status + JSON.stringify(res))
                    alert(res.data)
                }
            });
        }
    })
})

三、项目运行效果

前面通过cleos给账号lixu发行了100个EOS,现在通过他去转账。

2018-10-12 18.11.58

项目源码Github地址

版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者取得同意并注明出处。

未经授权禁止转载、改编,转载请注明出处!

上一篇: EOS钱包开发:新建钱包、解锁钱包、导入账号
下一篇: 从零开始学习比特币开发:生成地址
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,723.74
37,091.22 USDT
+0.1%
ETH以太坊
¥14,416.22
2,019.90 USDT
-0.12%
USDT泰达币
¥7.20
1.01 USDT
0%
BNB币安币
¥1,625.40
227.74 USDT
+0.36%
XRP瑞波币
¥4.32
0.60460 USDT
+0.37%
USDC
¥7.14
1.00 USDT
+0.03%
SOLSolana
¥398.85
55.89 USDT
+1.54%
OKBOK币
¥398.61
55.85 USDT
-1.64%
ADA艾达币
¥2.68
0.37580 USDT
-1.16%
DOGE狗狗币
¥0.55160
0.07730 USDT
-1.52%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.402E-5 USDT
-18.95%
Gala
¥0.18
0.025374 USDT
-4.66%
dYdX
¥22.58
3.1918 USDT
-0.91%
比特股
¥0.05
0.006964 USDT
+4.28%
PancakeSwap
¥15.52
2.1936 USDT
-2.74%
Conflux
¥1.08
0.1524 USDT
-2.87%
Filecoin
¥31.45
4.4454 USDT
-0.69%
FTX Token
¥29.82
4.2155 USDT
+16.96%
Yield Guild Games
¥2.55
0.3608 USDT
-0.52%
Shiba Inu
¥0.00
8.14E-6 USDT
-2.51%
比特币
¥262,381.44
37091.22 USDT
+0.1%
比原链
¥0.07
0.010011 USDT
-4.38%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP