新手教程 EOSIO 转帐详解

lome · 2018年05月10日 · 最后由 dnbstarz 回复于 2018年08月22日 · 4159 次阅读
本帖已被设为精华帖!

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" : {
        ........
    }
}

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

转载请说明文章出处

共收到 89 条回复
strahe 将本帖设为了精华贴 05月10日 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 测试网络启动教程 中提及了此贴 05月14日 13:39

请问,如何查看数据库

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接口

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册