《我学区块链》—— 五、Remix简单使用

五、Remix简单使用

       目前以太坊智能合约的编辑器主要有在线的 http://remix.ethereum.org;由 remix-ide自己搭建的;以及 Mac,Linux 系统上的 Remix-app 三种。三者的使用方式一致,这里以 Mac 平台的 Remix-app 为例。

1、使用 Remix-app 来编译合约

       打开安装的 remix-app,在左侧填入以下代码,代码功能很简单,不做过多解释,只是将输入的数字乘以 8,再返回。

pragma solidity ^0.4.23;
contract DemoTypes {
    function f(uint a) public pure returns (uint b) {
        uint result = a * 8;
        return result;
    }
}

Remix源码编辑界面

       点击 Details 按钮后可以看到智能合约编译后的一些产物,复制其中的 WEB3DEPLOY 中的代码到命令行,且 accounts[0] 账户处于解锁状态即可进行智能合约的部署

合约编译结果

       在窗体右侧,切换到 settings 选项卡,可以选择 solidity 编译器版本,推荐选择稳定版本。

编译器版本

2、使用 Remix-app 调试合约

       在合约编译通过的前提下,在右侧切换到 Run 选项卡,点击 Create 按钮,可以创建一个合约实例,在合约实例的函数 f 后面输入 100,点击 f,可以看到返回值为 800,说明合约可以工作。

调试合约

3、Solidity 源代码分析

       这个最简单的智能合约代码如下:

pragma solidity ^0.4.23;
contract DemoTypes {
    function f(uint a) public pure returns (uint b) {
        uint result = a * 8;
        return result;
    }
}

       第一行 pragma solidity ^0.4.23;是必须的,否则编译器将不知道该如何选择编译器,以及编译版本。
       第二行,和传统面向对象语言中的类很想像,有构造函数,有继承,有变量,有function,也有抽象类等概念,由 Solidity所写的智能合约,经过编译后会由以太坊虚拟机 EVM 来部署执行。

contract DemoTypes {
    ...
}

       第三行

function f(uint a) public pure returns (uint b) {
    ...
}

       前面说过,合约中包含方法和变量,function f(uint a) public pure returns (uint b)代表定义了一个名为 f 的方法,输入变量为 uint a,输出为 uint b。
       uint 代表无状态整形数字,即大于 0 的整数。
       uint 默认为 uint256,即最大值为 2 的 256次方,这个数字对于绝大多数的数学去处已经足够了。同理还有 uint8 等。

4、Remix-ide本地部署

       由于一些原因,可能还是需要使用在线编译器,而 http://remix.ethereum.org 的服务器在国外,速度较慢。因此,接下来还是补充一下 remix-ide 的本地部署相关内容,可以选择部署在内网服务器上,这样内网人员就可以一起用了。


       首先需要安装 nodejs 及 npm,且 node 版本需要 > 4.6 & < 9

sudo apt-get install -y nodejs nodejs-legacy git
sudo apt-get update
sudo apt-get install -y npm
sudo npm install -g nrm         # 安装 npm 源管理器
sudo npm install -g n           # 安装 node 多版本管理器
nrm use taobao                  # 使用 taobao 的源
sudo n v9                       # 使用 node v9 版
sudo chown -R $USER:$(id -g $USER) ~/.config
sudo npm install -g npm         # 在 node v9 环境下再次更新 npm

       接下来安装 remix-ide

sudo apt-get install -y git
git clone https://github.com/ethereum/remix-ide.git
cd remix-ide
npm install
npm run setupremix
npm start

       执行成功后,通过浏览器访问 地址+8080(端口号),可打开本地部署的 remix-ide 在线版。

本地remix-ide

5、最佳实践

       首行说明,这里所说的最佳实践是笔者认为的一种比较高效快捷的开发经验,不代表行业共识,只作参考。

       在笔者的体验中,remix-ide 不能很好的支持左侧的目录结构,而实际的合约项目可能不仅包含 Solidity 合约代码,也会包含一些工具类,像 Lib,因此 remix-ide 不方便进行一些多合约的开发。而另外的 remix-app,虽已是一款本地 app,但其与本地文件系统的结合仍然不好,笔者的亲身经历是没能够打开本地合约工程项目。

       在真实的合约项目开发中,一般都会用到一款框架 Truffle,该框架本身可以通过脚本化的方式,支持合约的编译、测试、部署,而且其 Solidity 编译版本也是紧跟 Solidity 官方发布版本,十分方便。因此,这里笔者给出一种还算方便快捷的开发实践:笔者选择的 IDE 是 WebStorm,在其插件仓库中搜索 solidity,会发现有两款插件,这里对这两款插件作一些解释:

WebStorm安装插件

       - Intellij-Solidity 是 Solidity 的代码高亮;

       - Solidity Solhint 是 Solidity 的语法检查,按照 Solidity 的语法版本来检查,不合法的语法会提示错误。

       依笔者的测试,在写这篇文章时,Solidity Solhint 的语法版本应在 Solidity v0.4.21 左右,而 Truffle 中的 Solidity 版本是 0.4.23,因此 0.4.21 中的如下写法已在 0.4.23 中被标记为 deprecated,导致 truffle 中编译无法通过:

function Token() public {}

       原本的大写方法名首字母,以作为构造函数的写法被废弃,取而代之的是下面这种写法:

constructor() public {} 

       而像事件触发,原本是直接调用事件方法,现已被带 emit 前缀的调用所替代:

event votedEvent(uint indexed_candidateId);
votedEvent(_candidateId);
event votedEvent(uint indexed_candidateId);
emit votedEvent(_candidateId);

       所以,这里我们只安装 Intellij-Solidity 插件,来进行代码高亮,不使用插件的语法检查,语法错误由 truffle 在编译阶段进行提示。这样,用来开发智能合约项目已经十分方便了,而且可以继续使用 JetBrains 家族 IDE 的大量快捷键,实现手不离键盘开发。

WebStorm编写代码

猜你喜欢

转载自blog.csdn.net/xuguangyuansh/article/details/80308243
今日推荐