新手教程 EOSIO 转帐详解

lome · May 10, 2018 · Last by ring888 replied at December 26, 2018 · 7229 hits
本帖已被设为精华帖!

EOSIO 转帐详解

前言:最近有许多小伙伴问关于转账的一些操作,笔者在这里写一个教程进行详细说明。

EOS 和 EOS 的不同之处

在 EOS 网络中存在两种货币,一种是 EOS,还有一种是 EOS 网络中的代币。说到这里大家似乎有点疑惑,举个简单的例子,就好比 ETH 网络中的 ETH,ETH 网络中的其他代币。这样大家或许都清除了吧。

在目前 EOS 网络中可以通过合约eosio.token产生多种名称为EOS的代币。但是还有一种通过合约eosio.system合约发布的代币,它是EOS网络中真正的 EOS,他会存储在用户的账户中。可以通过cleos transfer来交易。

通过eosio.token发布的EOS代币

  1. 发布bios合约
cleos set contract eosio eosio.bios/
  1. 创建账户
cleos create account eosio eostea EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
>result
executed transaction: c10ba7625be38c823426ac9c974a7c3a774594ea80f600d95c88dc9d1053a3c6  352 bytes  102400 cycles
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"eostea","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJq...

  1. eostea发布代币 EOS 发布合约:
> cleos set contract eostea eosio.token/
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: 7908bd47ae2c68ffa8f0f51bc2401e9deda2e06e16fc60356afa27f316ef529f  8032 bytes  2200576 cycles
#         eosio <= eosio::setcode               {"account":"eostea","vmtype":0,"vmversion":0,"code":"0061736d01000000018a011660067f7e7f7f7f7f0060057...
#         eosio <= eosio::setabi                {"account":"eostea","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name":"fro...

创建代币:

>cleos push action eostea create '["eostea","10000000 EOS",0,0,0]' -p eostea
executed transaction: ae707244932ccd9c3b5a579d1e3875de6c0188d2024447c90df9ad716ad5ac41  248 bytes  104448 cycles
#        eostea <= eostea::create               {"issuer":"eostea","maximum_supply":"10000000 EOS","can_freeze":0,"can_recall":0,"can_whitelist":0}

发布代币:

$ cleos push action eostea issue '["eostea","100000 EOS","issue"]' -p eostea
executed transaction: 8e37f71b607d4ec0fd9ef7582b296e0b738a13948fe9cc82090cb96c1db8054e  256 bytes  107520 cycles
#        eostea <= eostea::issue                {"to":"eostea","quantity":"100000 EOS","memo":"issue"}
>> issue

查看代币:

$cleos get currency balance eostea eostea
10000 TEA
100000 EOS

下面笔者来做一个实验,用 eosio 再创建一种EOS代币,得到的结果:

cleos get currency balance eosio eosio
10000 EOS

给 eostea 转账:

cleos push action eosio transfer '["eosio","eostea","100 EOS",""]' -p eosio

查看 eostea 的代币:

lome@lome:~/eos/build/contracts$ cleos get currency balance eostea eostea
10000 TEA
100000 EOS
lome@lome:~/eos/build/contracts$ cleos get currency balance eosio eostea
100 EOS

这样我发型了两种EOS代币。但是..... 看看数据库里面是这样的:

{
    "_id" : ObjectId("5af41c653c27103f203a6beb"),
    "name" : "eostea",
    "eos_balance" : "0.0000 EOS",
    "staked_balance" : "0.0000 EOS",
    "unstaking_balance" : "0.0000 EOS",
    "createdAt" : "2018-05-10T10:18:13.008Z",
    "updatedAt" : "2018-05-10T10:19:34.007Z",
    "abi" : {
        ......
    }
}

eos_balance 是0;

发型EOS

$ cleos push action eosio issue '["eosio","10000000.0000  EOS",""]' -p eosio
executed transaction: ad53e2b11f1b90f8cb3c5edff982fde7e87f4011773e179ca5a963df14c7227c  248 bytes  120832 cycles
#         eosio <= eosio::issue                 {"to":"eosio","quantity":"10000000.0000 EOS"}
#         eosio <= eosio::transfer              {"from":"eosio","to":"eosio","quantity":"10000000.0000 EOS","memo":""}

然后查看账户eosio:

{
    "_id" : ObjectId("5af41b903c27103f203a6392"),
    "name" : "eosio",
    "eos_balance" : "10000000.0000 EOS",
    "staked_balance" : "0.0000 EOS",
    "unstaking_balance" : "0.0000 EOS",
    "createdAt" : "2018-05-10T10:14:40.258Z",
    "updatedAt" : "2018-05-10T11:44:28.506Z",
    "abi" : {
        ........
    }
}

转账:

cleos transfer eosio eostea 1000000
executed transaction: 76a8b7f4ab67d8205661c0848d6dd4566830e84ca2b86a2ae44cef58c6cea4e1  256 bytes  107520 cycles
#         eosio <= eosio::transfer              {"from":"eosio","to":"eostea","quantity":"100.0000 EOS","memo":""}
#        eostea <= eosio::transfer              {"from":"eosio","to":"eostea","quantity":"100.0000 EOS","memo":""}

账户余额:

{
    "_id" : ObjectId("5af4336c3c27100f643add5f"),
    "name" : "eostea",
    "eos_balance" : "100.0000 EOS",
    "staked_balance" : "0.0000 EOS",
    "unstaking_balance" : "0.0000 EOS",
    "createdAt" : "2018-05-10T11:56:28.501Z",
    "updatedAt" : "2018-05-10T12:05:38.507Z",
    "abi" : {
        ........
    }
}

相信看完这些,大家都非常清楚了。

转载请说明文章出处

strahe 将本帖设为了精华贴 10 May 21:00

5 块打赏给你.

支持! 群里的那个小哥的问题估计也是解决了。 主要就是合约不一样导致的。 contract.system 的作用比较高,而且是由 eosio 来 set 的 ,而且 system / bios 配合完成网络资源的控制。 后者的 eosio.token 就类似于之前例子中的 currency 的合约了,申请的 account 都可以有权限发布这样的合约。

VincentShi 回复

感谢 VincentShi。 几个小问题不太明白,1 是看数据库是啥命令看的。2 发行 EOS 就真正的 EOS 还是代币?3 是后面那个通过 eosio 发行的 EOS,应该是通过 eosio.system 的合约么?一个账户就能部署一个合约,eosio 账户是要切换到 system 的合约上么?

我有一种中间少了一段内容的感觉。

谢谢!

imoonstal 回复
  1. 我也想知道
  2. EOS 就是 EOS,不是代币或者 token
  3. 我刚刚尝试用其他账户部署好像能 issue 不能转账

发币转账的合约只有 eosio.token,eosio.system 是投票相关的合约,里面调的发币合约还是 eosio.token 本身的

OuterST 回复

那是不是说 EOS 和 EOS 代币,就一样了?

还是不太懂 “EOS 本身” 和 “名字叫 EOS 的代币” 有什么区别?上面发的感觉应该是后者。

另外,在 eosio.token 下,是不能通过cleos push action mytest transfer '["mytest","ryctoken","0.1000 EOS",""]' -p mytest转 EOS 的,会报错

最后还有一个问题,就是在 eosio.system 下转了 EOS,如何查询余额?

谢谢!

这样我发型了两种EOS代币。但是..... 看看数据库里面是这样的:

请问,如何查看数据库

imoonstal 回复

cleos push action mytest transfer '["mytest","ryctoken","0.1000 EOS",""]' -p mytest 这个要成功,几个点,钱包打开,push action 的 mytest 是只合约名,而这个合约名,应该是你从 eosio.token 部署来的,部署的时候需要 -p mytest,而另外两个 mytest 代表的是账号名。 查询:cleos get table mytest(eosio.token 对应的合约名) mytest(要查询的账号名) accounts(eosio.token 中的表名)

Surou EOSIO 4.0 测试网络启动教程 中提及了此贴 14 May 13:39

mark

请问,如何查看数据库

wjl1008 回复

cleos get table

大神 ,如何在合约中调用转账接口(api 文档中似乎没有),类似于以太坊中的 address.transfer(value); 我写个赌¥# 博合约 demo,需要在合约中自动转账,但是找文档一直没找到😃 😂

查看源码发现了这个😂

364664251 回复
action(
            permission_level{ account, N(active) },
            N(eosio.token), N(transfer),
            std::make_tuple(account, _self, price, std::string(""))
         ).send();

可以看一下dice合约。

lome 回复

好的 谢谢。在 eosio.system.cpp 中也有一个,但我不知道能不能用。 INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {bidder,N(active)}, { bidder, N(eosio.names), bid, std::string("bid name ")+(name{newname}).to_string() } );

364664251 回复

enen,可以试试的

@lome 也就是说 通过账户 eosio 发的货币就是官方的 EOS 货币, 自己的账户 eostea 发的货币就是自己发的代币, 他们都调用了 currency 这个合约 是这个意思吗?

那在查询账户上是不是有官方 EOS 货币通过

/v1/chain/get_currency_balance  

中传递的参数

{
"account":"xxxxx",
"code":"eosio.token",
"symbol":"EOS",
"json":true
}

这样没问题吧?

364664251 回复

调用 EOS 的 transfer 方法能实现吗?我也有这个需求,但是我调用的时候老是提示我没有 eosio.code 的权限 好像是 EOS 没有提供 sign_transaction 接口

谢谢。。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up