第6课 用SI编写"Hello World"智能合约,开启EOS之旅

1,摘要

【本文目标】 通过本文实践,能够使用SI(Source Insight)编辑EOS的智能合约代码,并通过编译,执行来测试"Hello World"代码。 【前置条件】 1) 已完成了EOS编译,编译测试成功; 2) 钱包,账号已创建完毕; 钱包名字: duncanwang 打开密码: "PW5K8vabia4Gba7Tos8wVH6XFc7bKYcR9uTfuaPqcNsPyg2HduFou" 钱包已导入系统密钥对: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV :5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 已创建账号: wangdenghui 【说明】这个钱包,账号为测试使用,学习者创建自己的账号资源即可。

【技术收获】 1)Source Insight的安装和使用 2)最简EOS智能合约写作 3) 合约代码的编译和执行

2,实践内容

2.1 Source Insight的安装和配置

1)source insight 介绍

EOSIO的智能合约代码采用C++编程语言完成,目前有多款编辑器或者集成IDE环境例如Visual Studio 2017/ Source Insight / Visual Studio Code / UtraEdit等多款 软件支持。对通信背景的人来说,大家特别习惯使用 Source Insight,其关联查看功能确实比其他软件更方便。

Source Insight是如今最好用的语言编辑器之一,支持几乎所有的语言, 如C、C++、ASM、PAS、ASP、HTML,PHP,JSON,Python等常见的,也可以通过导入配置文件的方式支持GO语言(下载地址:https://www.sourceinsight.com/download/), 还支持自己定义关键字,Source Insight提供了可快速访问源代码和源信息的功能。

2)Source Insight安装

参考《三步完成Source Insight 4.0 破解安装》完成Source Insight版本下载和安装。

3) Source Insight配置

如果要使Source Insight支持Go语言和ABI文件的参考,让字体和背景颜色更适合眼睛,需要做一定的配置。

不愿意自己配置的同学,可以加入知识星球后下载该配置文件,在菜单"Options/Load Configuration"导入"wangdenghui SI 配置.xml"文件,即可快速完成配置工作。

2.2 编写最简智能合约程序

1)建立工程

菜单Project / New Project创建一个命名为Hello的工程。

2)菜单File / New 创建一个"Hello.cpp"的文件

3)编写程序

创建文件后,输入最简程序的内容。本文不解释C++语法和内容,我们的目标是先跑通代码。

#include <eosiolib/eosio.hpp>
#include <string>

using namespace eosio;

class hello : public eosio::contract {
  public:
      using contract::contract;

      /// @abi action 
      void hi( std::string strContent ) {
         print( "Hello ", strContent);
      }
};

EOSIO_ABI( hello, (hi) )

2.3 编译和部署运行

1)Hello.cpp文件上传到EOS编译环境目录下

2)编译合约

eosiocpp -o表示在该目录下产生一个hello的智能合约代码。

eosiocpp -o hello.wast hello.cpp

操作输出,增加了hello.wast文件:

duncanwang@duncanwang:~/eos/build/contracts/hello$ eosiocpp -o hello.wast hello.cpp
duncanwang@duncanwang:~/eos/build/contracts/hello$ ls
CMakeLists.txt  hello.cpp  hello.hi_rc.md  hello_rc.md  hello.wasm  hello.wast

eosiocpp -g hello.abi hello.cpp 输出结果:

duncanwang@duncanwang:~/eos/build/contracts/hello$ eosiocpp -g hello.abi hello.cpp
Generated hello.abi ...

eosiocpp -g产生"hello.abi"文件。 ABI(Application Binary Interface): 应用程序二进制接口 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。ABI涵盖了各种细节,如:

  • 数据类型的大小、布局和对齐;
  • 调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;
  • 系统调用的编码和一个应用如何向操作系统进行系统调用;
  • 以及在一个完整的操作系统ABI中[目标文件的二进制格式、程序库等等。 [1] ABI不同于API ,API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译 ,然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。 ABI掩盖了各种细节。

2.4 部署智能合约

cleos set contract wangdenghui ../hello -p wangdenghui

duncanwang@duncanwang:~/eos/build/contracts/hello$ cleos set contract wangdenghui ../hello -p wangdenghui
Reading WAST/WASM from ../hello/hello.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 79830b81c90a22ab42b427ac70ff0c764441d92ea128999712e3376ae6b2460d  4168 bytes  741 us
#         eosio <= eosio::setcode               {"account":"wangdenghui","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60...
#         eosio <= eosio::setabi                {"account":"wangdenghui","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d650100...
warning: transaction executed locally, but may not be confirmed by the network yet

这个命令序列的结果是,cleos发起一个包含两个操作(actions)的交易(transaction):eosio::setcode和eosio::setabi。 代码定义了合约如何运行,abi描述了参数如何在二进制和json表示之间进行转换。 这个命令最后一个参数是-p wangdenghui。该参数告诉cleos,用wangdenghui账户的active权限签署此操作,就是使用我们先前导入钱包的wangdenghui账户私钥对操作进行签名。

2.5 执行智能合约

cleos push action wangdenghui hi '["World!"]' -p wangdenghui

输出结果有>> "Hello World!"

duncanwang@duncanwang:~/eos/build/contracts/hello$ cleos push action wangdenghui hi '["World!"]' -p wangdenghui
executed transaction: d10de21ee792c4997ae697e5db00ad571cfd67c374e9e9fcb741a2a7046c9e49  104 bytes  830 us
#   wangdenghui <= wangdenghui::hi              {"strContent":"World!"}
>> Hello World!
warning: transaction executed locally, but may not be confirmed by the network yet

【问题】 合约执行并没有输出"hello, World!的内容"

duncanwang@duncanwang:~/eos/build/contracts/hello$ cleos push action wangdenghui hi '["wangdenghui"]' -p wangdenghui
executed transaction: 51ff4e32f556cedfc1a36f79a156a4dce7a5f93aa9037c83e149164189f57ea1  104 bytes  658 us
#   wangdenghui <= wangdenghui::hi              {"user":"wangdenghui"}
warning: transaction executed locally, but may not be confirmed by the network yet

【解决方法】 如果要在终端现实print的结果,需要在配置文件config.ini中,将contracts-console 设为 true,即: contracts-console = true 该配置文件的位置在~/.local/share/eosio/nodeos/config,修改后重启节点。

3,参考

1) Hello World合约 2)Go笔记 1.3 让SourceInsight支持Golang 4)【许晓笛】怎么看 EOS 的代码最爽? 5)source insight 背景颜色修改 代码字体大小修改 中文注释空格去除

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pythonista

震惊!最全PyCharm教程

PyCharm是一个用于计算机编程的集成开发环境(IDE),主要用于Python语言开发,由捷克公司JetBrains开发,提供代码分析、图形化调试器,集成测试...

40130
来自专栏小狼的世界

使用PHP脚本来写Daemon程序

这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地...

16720
来自专栏吴生的专栏

SpringBoot整合RabbitMQ之典型应用场景实战一

实战前言 RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用...

15900
来自专栏FreeBuf

如何将简单的Shell转换成为完全交互式的TTY

作为一名渗透测试人员,最令人激动的莫过于netcat为我们反弹回了一个shell连接,以及通过id命令查看到一个令人满意的用户权限。但凡事总有意外,由于我们获取...

46240
来自专栏Urahara Blog

域渗透-信息收集基础

86050
来自专栏大数据架构师专家

namp 渗透测试-安装篇

nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统。

16130
来自专栏北京马哥教育

JMeter使用技巧

在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享。本文内容如下。 如何使用英文界面的jmeter 如何使用镜像...

54190
来自专栏小白安全

小白博客 kali linux系统安装之物理机的详细安装步骤

系统要求 Kali 系统对硬件有一些最基本的要求及建议。根据用户使用目的,你可以使有更高的配置。这篇文章中假设读者想要把 kali 安装为电脑上唯一的...

71340
来自专栏Kirito的技术分享

浅析分布式下的事件驱动机制(PubSub模式)

上一篇文章《浅析Spring中的事件驱动机制》简单介绍了Spring对事件的支持。Event的整个生命周期,从publisher发出,经过application...

470100
来自专栏IT米粉

IntelliJ IDEA插件——冷门神器分享

IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件。 前言 IDEA自不...

58460

扫码关注云+社区

领取腾讯云代金券