【系列】EOS开发3 EOS提供的程序和工具

上一篇文章使用了nodeos命令来启动eos服务,这一篇文章,就来介绍一下eos提供的相关程序和工具。

  • nodeos
    EOSIO的核心守护进程,它可通过插件配置来启动一个节点。
  • cleos
    这是一个命令行工具,它跟nodeos开放的REST API接口进行交互。在cleos使用时需要带上 nodeos实例的IP和端口。此外,cleos提供全面的命令行提示,如果不清楚说那个什么参数,可直接输 cleos 回车后会打印出 参数说明。如果需要查看子命令后的参数,也是如此,比如 输入 cleos create
    
    ERROR: RequiredError: Subcommand required
    Create various items, on and off the blockchain
    Usage: ./cleos create SUBCOMMAND

Subcommands:
key Create a new keypair and print the public and private keys
account Create a new account on the blockchain


* **keosd**
EOSIO钱包守护进程,它云加载钱包相关插件,比如http接口和RPC API

* **launcher**
launcher应用程序简化了在LAN和WAN网络上多个nodeos节点的分布

* **eosiocpp**
 eosiocpp通过检查合约源代码中定义内容的类型,来生成ABI规范文件
 为了指示一个类型需要导出到ABI文件,在类型声明上必须加上@abi这个注解, 比如

@abi action [name name2 ... nameN]
@abi table [index_type name]

  要生成abi文件,esoiocpp必须加-g

eosiocpp -g abi.json types.hpp

Generated abi.json ...

  eosiocpp也可以生成 `helper function` 来序列化/反序列化 ABI 文件里声明的类型

  例如
  #### 声明一个`action`
#include <eosiolib/eosio.hpp>

class example : public eosio::contract {
   //@abi action
   void exampleaction( uint64_t param1, uint64_t param2, std::string param3 ) {
   }
};

{
  "types": [],
  "structs": [{
      "name": "exampleaction",
      "base": "",
      "fields": [{
           "name": "param1",
           "type": "uint64"
        },{
           "name": "param2",
           "type": "uint64"
        },{
           "name": "param3",
           "type": "string"
        }
      ]
    }
  ],
  "actions": [{
      "name": "exampleaction",
      "type": "exampleaction",
      "ricardian_contract": ""
    }
  ],
  "tables": [],
  "ricardian_clauses": [],
  "abi_extensions": []
}

  #### 声明一张 `table`
#include <eosiolib/eosio.hpp>

//@abi table my_table
struct my_record {
  uint64_t    ssn;
  std::string fullname;
  uint64_t primary_key() const { return key; }
};
{
  "types": [],
  "structs": [{
      "name": "my_record",
      "base": "",
      "fields": [{
        "name": "ssn",
        "type": "uint64"
      },{
        "name": "fullname",
        "type": "string"
      }
      ]
    }
  ],
  "actions": [],
  "tables": [{
      "name": "my_table",
      "index_type": "i64",
      "key_names": [
        "ssn"
      ],
      "key_types": [
        "uint64"
      ],
      "type": "my_record"
    }
  ],
  "ricardian_clauses": [],
  "abi_extensions": []
}

  #### typedef exporting
  #include <eosiolib/eosio.hpp>
struct simple {
  uint64_t u64;
};

typedef simple simple_alias;
typedef eosio::name name_alias;

class examplecontract : eosio::contract {
//@abi action
   void actionone( uint32_t param1, name_alias param2, simple_alias param3 ) {}
};
{
  "types": [{
      "new_type_name": "simple_alias",
      "type": "simple"
    },{
      "new_type_name": "name_alias",
      "type": "name"
    }
  ],
  "structs": [{
      "name": "simple",
      "base": "",
      "fields": [{
        "type": "uint64",
        "name": "u64"
      }]
    },{
      "name": "actionone",
      "base": "",
      "fields": [{
        "type": "uint32",
        "name": "param1"
      },{
        "type": "name_alias",
        "name": "param2"
      },{
        "type": "simple_alias",
        "name": "param3"
      }
     ]
    }
  ],
  "actions": [{
      "name": "actionone",
      "type": "actionone",
      "ricardian_contract": ""
    }
  ],
  "tables": [],
  "ricardian_clauses": [],
  "abi_extensions": []
}

  #### 使用生成的序列化/反序列化函数并明确用户自定义的apply
#include <eosiolib/eosio.hpp>

struct simple {
  uint32_t u32;
};

struct my_complex_type {
  uint64_t u64;
  std::string str;
  simple simple;
  eosio::bytes bytes;
  public_key pub;
};

typedef my_complex_type complex;

//@abi action
struct test_action {
  uint32_t u32;
  complex cplx;
};

extern "C" {
   void apply( uint64_t code, uint64_t action, uint64_t receiver ) {
      if( code == N(mycontract) ) {
         if( action == N(testaction) ) {
            eosio::print("test_action content\n");
            test_action testact = eosio::unpack_action_data<test_action>();
            eosio::print_f( "Test action : % %", testact.u32, testact.cplx.u64 );
        }
     }
   }
}

「力场 lichang.io」公链挖矿第一社区!

原文地址:https://blog.51cto.com/13899701/2369576

时间: 2024-08-30 16:30:16

【系列】EOS开发3 EOS提供的程序和工具的相关文章

FineBI学习系列之FineBI官网提供的程序数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-31.html 目录: 1.描述 2.实现原理 3.案例 1.描述 由上一节BI可能通过设计器远程服务器的方式,以服务器数据集的形式来连接数据. 这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可

【系列】EOS开发4 EOS中账户、钱包和密钥的关系

EOS对于账户的设计与ETH有很大的不同,引入了Account账户, Wallet钱包, 钱包密码, Key公私钥, Permission权限等众多概念,刚入门的时候感觉一头雾水.本文希望通过对这些概念的梳理,帮助读者能够很容易的上手EOS智能合约的开发. 如图所示,右边是EOS Wallet钱包,里面只存放私钥,而且钱包有一个密码,需要输入密码才能解锁钱包,读取私钥.左边是EOS Account账户,可以把它看成是一个保险箱,里面有EOS Token以及智能合约,而需要转移里面的EOS Tok

【系列】 EOS开发6 创建EOS账户

安装docker 使用命令行创建EOS账户需要有一套EOS开发环境,这里我们使用一个已经安装了EOS套件的docker环境,本文使用Mac系统,关于docker软件的安装可查看Mac docker install 创建EOS账户 启动docker docker run --rm -it eosio/eos:latest /bin/bash 确认eos主网信息 root@7dd4e87a4ac7:/opt/eosio# ./bin/cleos -u http://mainnet.eoswz.com

EOS开发环境搭建

获取代码 下载所有的EOSIO代码,clone eos库和所有的子模块. shell 命令如下: git clone https://github.com/EOSIO/eos --recursive 如果忘记加 --recursive 参数也没关系,随后也可以用命令 clone 所有子模块. git submodule update --init --recursive 安装构建设置 EOSIO可以在多个平台上安装构建,并有各种路径进行安装构建.大多数用户更喜欢使用自动化脚本或docker,而更

普元EOS开发积累第一篇(常见错误解决方法) 持续更新

普元启动服务失败的解决方法 当多个人同时使用一个数据库的时候,启动普元控制台会一直停留在rcall,然后显示一个超时的警告,那样就需要修改一下普元的一个定时器配置项. 安装目录下\Primeton\Platform\apps_config\default\config 中的一个user-config.xml文件 将下列代码中高亮字段中的true改为false即可  <module name="Schedule">          <group name="

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序读取相关数据 原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经完成了学校数据模型.在本教程中你将

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用高级功能

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十二篇:为ASP.NET MVC应用程序使用高级功能 原文:Advanced Entity Framework 6 Scenarios for an MVC 5 Web Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中,您已经实现了继承.本教程引入了当你在使用实体框架Code

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序创建更复杂的数据模型 原文:Creating a More Complex Data Model for an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经创建了由三个实体组成的简单的数据模型.在本教程中