eos 的工程文件中包含了一些程序和工具下面就是你目标可以用的, 能看到的
程序
eosd
EOS daemon 的缩写, 可以理解为 EOS 的主程序, 用来运行节点的比如说你是个区块生产者, 那你可以只跑这个程序
eosc
EOS commandline tool 也就是命令行工具可以操作 eosd 中有的 REST api 官方也在介绍里说了, 想要使用 eosc, 必须有一个端口开放给 eosd, 同时设置好 eosc 去加载 eosio::chain_api_plugin
eosc 支持的指令如下
- ERROR: RequiredError: Subcommand required
- Command Line Interface to Eos Client
- Usage: ./eosc [OPTIONS] SUBCOMMAND
- Options:
- -h,--help Print this help message and exit
- -H,--host TEXT=localhost the host where eosd is running
- -p,--port UINT=8888 the port where eosd is running
- --wallet-host TEXT=localhost
- the host where eos-walletd is running
- --wallet-port UINT=8888 the port where eos-walletd is running
- -v,--verbose output verbose messages on error
- Subcommands:
- version Retrieve version information
- create Create various items, on and off the blockchain
- get Retrieve various items and information from the blockchain
- set Set or update blockchain state
- transfer Transfer EOS from account to account
- net Interact with local p2p network connections
- wallet Interact with local wallet
- benchmark Configure and execute benchmarks
- push Push arbitrary transactions to the blockchain
- eos-walletd
EOS 钱包主程序
launcher
用于简化多个 eosd 在 LAN 下分发可以用 CLI 对每个 node 的配置文件进行配置
snapshot
位于 EOSIO/genesis 下的一个模块, 其中有一个 nodejs 程序用于生成密集交易合约快照
工具
eoscpp
用于生成 ABI 规范文件的工具
eoscpp 能够识别合约中源代码内容, 生成 ABI 规范文件
如需申明一个类型到处到 ABI 中, 比如是一个操作, 或者是一张表格, 必须在类型生命之前的注释中添加 **@abi** 标识符
语法如下:
- @abi action [name name2 ... nameN]
- @abi table [index_type name]
eoscpp 在使用的时候必须附加上 - g 选项
- eoscpp -g abi.json types.hpp
- Generated abi.json ...
eoscpp 当然也可以用以生成 序列化 / 逆序列化 的辅助函数
- eoscpp -g abi.json -gs types.hpp
- Generated abi.json ...
- Generated types.gen.hpp ...
例子
申明一个操作
- #include < eoslib / types.hpp > #include < eoslib / string.hpp >
- //@abi action
- struct action_name {
- uint64_t param1;
- uint64_t param2;
- eosio: :string param3;
- }; {
- "types": [],
- "structs": [{
- "name": "action_name",
- "base": "",
- "fields": {
- "param1": "uint64",
- "param2": "uint64",
- "param3": "string"
- }
- }],
- "actions": [{
- "action_name": "actionname",
- "type": "action_name"
- }],
- "tables": []
- }
一次申明多个操作
- #include < eoslib / types.hpp > #include < eoslib / string.hpp >
- //@abi action action1 action2
- struct action_name {
- uint64_t param1;
- uint64_t param2;
- eosio: :string param3;
- }; {
- "types": [],
- "structs": [{
- "name": "action_name",
- "base": "",
- "fields": {
- "param1": "uint64",
- "param2": "uint64",
- "param3": "string"
- }
- }],
- "actions": [{
- "action_name": "action1",
- "type": "action_name"
- },
- {
- "action_name": "action2",
- "type": "action_name"
- }],
- "tables": []
- }
申明一张表
- #include <eoslib/types.hpp>
- #include <eoslib/string.hpp>
- //@abi table
- struct my_table {
- uint64_t key;
- };
- {
- "types": [],
- "structs": [{
- "name": "my_table",
- "base": "","fields": {"key":"uint64"
- }
- }
- ],
- "actions": [],
- "tables": [{
- "table_name": "mytable",
- "index_type": "i64",
- "key_names": [
- "key"
- ],
- "key_types": [
- "uint64"
- ],
- "type": "my_table"
- }
- ]
- }
申明一张有明确类型的表格
- #include <eoslib/types.hpp>
- //@abi table i64
- struct my_new_table {
- uint64_t key;
- uint64_t name;
- uint64_t age;
- };
- {
- "types": [],
- "structs": [{
- "name": "my_new_table",
- "base": "","fields": {"key":"uint64","name":"uint64","age":"uint64"
- }
- }
- ],
- "actions": [],
- "tables": [{
- "table_name": "mynewtable",
- "index_type": "i64",
- "key_names": [
- "key"
- ],
- "key_types": [
- "uint64"
- ],
- "type": "my_new_table"
- }
- ]
- }
申明有相同结构的表和操作
- #include <eoslib/types.hpp>
- #include <eoslib/string.hpp>
- /*
- * @abi table
- * @abi action
- */
- struct my_type {
- eosio::string key;
- eosio::name value;
- };
- {
- "types": [],
- "structs": [{
- "name": "my_type",
- "base": "","fields": {"key":"string","value":"name"
- }
- }
- ],
- "actions": [{
- "action_name": "mytype",
- "type": "my_type"
- }
- ],
- "tables": [{
- "table_name": "mytype",
- "index_type": "str",
- "key_names": [
- "key"
- ],
- "key_types": [
- "string"
- ],
- "type": "my_type"
- }
- ]
- }
定义类型导出的案例
- #include < eoslib / types.hpp > struct simple {
- uint64_t u64;
- };
- typedef simple simple_alias;
- typedef eosio: :name name_alias;
- //@abi action
- struct action_one: simple_alias {
- uint32_t u32;
- name_alias name;
- }; {
- "types": [{
- "new_type_name": "simple_alias",
- "type": "simple"
- },
- {
- "new_type_name": "name_alias",
- "type": "name"
- }],
- "structs": [{
- "name": "simple",
- "base": "",
- "fields": {
- "u64": "uint64"
- }
- },
- {
- "name": "action_one",
- "base": "simple_alias",
- "fields": {
- "u32": "uint32",
- "name": "name_alias"
- }
- }],
- "actions": [{
- "action_name": "actionone",
- "type": "action_one"
- }],
- "tables": []
- }
使用生成的序列化 / 逆序列化函数
- #include < eoslib / types.hpp > #include < eoslib / string.hpp > struct simple {
- uint32_t u32;
- fixed_string16 s16;
- };
- struct my_complex_type {
- uint64_t u64;
- eosio: :string str;
- simple simple;
- bytes bytes;
- public_key pub;
- };
- typedef my_complex_type complex;
- //@abi action
- struct test_action {
- uint32_t u32;
- complex cplx;
- };
- void apply(uint64_t code, uint64_t action) {
- if (code == N(mycontract)) {
- if (action == N(testaction)) {
- auto msg = eosio: :current_message < test_action > ();
- eosio: :print("test_action content\n");
- eosio: :dump(msg);
- bytes b = eosio: :raw: :pack(msg);
- printhex(b.data, b.len);
- }
- }
- }
限制: 表和操作名称不能用下划线 (_)
用测试值去调用合约
eosc push message mycontract testaction '{"u32":"1000","cplx":{"u64":"472","str":"hello","bytes":"B0CA","pub":"EOS8CY2pCW5THmzvPTgEh5WLEAxgpVFXaPogPvgvVpVWCYMRdzmwx","simple":{"u32":"164","s16":"small-string"}}}' - S mycontract
产生的结果如下:
- test_action content
- u32:[1000]
- cplx:[
- u64:[472]
- str:[hello]
- simple:[
- u32:[164]
- s16:[small-string]
- ]
- bytes:[b0ca]
- pub:[03b41078f445628882fe8c1e629909cbbd67ff4b592b832264dac187ac730177f1]
- ]
- e8030000d8010000000000000568656c6c6fa40000000c736d616c6c2d737472696e6702b0ca03b41078f445628882fe8c1e629909cbbd67ff4b592b832264dac187ac730177f1
来源: https://juejin.im/post/5a7a709c6fb9a0635d0c0416