经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
EOS开发入门
来源:cnblogs  作者:通证派大本营  时间:2019/1/11 10:11:05  对本文有异议

EOS开发入门



??在上一篇文章《EOS开发环境搭建》中,我们已经完成了EOS开发环境的搭建,本次为大家带来的是EOS开发入门的相关内容。

1. EOS的合约开发基础

??智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。

1.1 所需知识

  • 熟悉或了解C++14的基本语法,这部分技能需要掌握,短时间内无法搞定。
  • 了解abi(The Application Binary Interface)文件,基于json格式的,描述合约的接口

1.2 c++与智能合约部分语法

  • require_auth——
    require_auth(name user): 验证用户是否有签名
  • [[eosio::action]] action声明的特殊标记
  • asset 是eos官方提供的一个结构体,内部主要有2个元素:amountsymbol
  • eosio_assert( expr, "errmsg" ) 验证表达式是否位置,类似于以太坊的assert
  • [[eosio::table]] table声明的特殊标记,在结构体声明中使用
  • multi_index 是eos提供的一个数据库存储结构,可以支持多个索引,同样有增删改查接口
  1. struct [[eosio::table]] task {
  2. uint64_t taskID;
  3. name creator;
  4. name worker;
  5. asset bonus;
  6. uint8_t status = 0;
  7. string remark;
  8. string comment;
  9. uint64_t primary_key()const { return taskID; }
  10. };
  11. typedef eosio::multi_index< "tasks"_n, task > tasks;
  12. //tasks 是最终的表名字,task是结构体名字
  • multi_index可以使用 findemplacemodifyearse四个接口,使用时需要先用tasks定义变量
  1. tasks tk( _code, _code.value );
  2. tk.emplace( creator, [&](auto &t){
  3. t.creator = creator;
  4. t.worker = worker;
  5. t.taskID = tk.available_primary_key();//主键自动增长
  6. t.bonus = taskBonus;
  7. t.remark = memo;
  8. });

1.3 理解abi文件

??这是一个空的abi文件

  1. {
  2. "version": "eosio::abi/1.0",
  3. "types": [],
  4. "structs": [],
  5. "actions": [],
  6. "tables": [],
  7. "ricardian_clauses": [],
  8. "abi_extensions": [],
  9. "___comment" : ""
  10. }
  • types 新类型定义
  • structs 合约内结构体定义
  • actions 合约内动作定义,注意在合约中需要使用特殊的标记才能在abi中得到
  • tables 合约内表结构定义,注意在合约中需要使用特殊的标记才能在abi中得到
  • ricardian_clauses 李嘉图条款
  • abi_extensions 扩展

??其中structsactionstables可以认为是abi文件的三要素,每个合约内可以有多个action,每个action会执行这样那样的逻辑,需要借助结构体的结构将信息存储或变更保存在区块链中,这个保存的数据我们类比为传统数据库中的表,也就是tables。我们学习智能合约编写主要要写什么?其实就是写一个一个action,类似于rpc中的微服务。与传统数据库编程一样,我们同样也是围绕着table做增删改查操作。

2. EOS的hello智能合约

2.1 编写hello合约

  • 合约代码如下
  1. #include <eosiolib/eosio.hpp>
  2. #include <eosiolib/print.hpp>
  3. using namespace eosio;
  4. class hello : public contract {
  5. public:
  6. using contract::contract;
  7. [[eosio::action]]
  8. void hi( name user ) {
  9. print( "Hello, ", user);
  10. }
  11. };
  12. EOSIO_DISPATCH( hello, (hi))

上例中hello是我们的类名,需要继承eos为我们提供的基类contract,[[eosio::action]]是一个特殊用法,定义一个action必须在函数声明前加上此标记。hi这个函数就是一个 action,本例实现的就是一个打招呼的action,根据输入的不同用户进行打招呼。

EOSIO_DISPATCH( hello, (hi)) 是生成action的关键,EOSIO_DISPATCH是eos提供的宏,hello显然就是类名,(hi)就是要生成的action,如果多个action,采用相同格式在后面添加。

2.2 hello合约的部署和调用

  • 使用eosio-cpp编译hello合约,这个就来自于cdt工具包
  1. eosio-cpp -o hello.wasm hello.cpp --abigen

image

  • 创建hello合约账户
  1. cleos create account eosio hello YOUR_PUBLIC_KEY -p eosio@active
  • 部署hello合约
  1. cleos set contract hello ./hello -p hello@active

image

  • 调用hello合约
  1. //先创建一个普通账户bob
  2. cleos create account eosio bob YOUR_PUBLIC_KEY -p eosio@active
  3. //bob调用hello合约的hi动作
  4. cleos push action hello hi '["bob"]' -p bob@active

image

??到这一步,一个简单的hello智能合约就部署并调用完成了,快来试试吧。下次将为大家分享关于EOS开发实战的内容,敬请关注。




image

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号