Solidity语言编辑器REMIX指导大全

1. 文章摘要

 

【本文目标】
本文翻译和实践Solidity语言编辑器REMIX官网帮助文档,但并不拘泥于逐字翻译,而时根据实践用中文语言讲透编辑器相关功能。
【前置条件】
了解以太坊ETH和Solidity语言。
【技术收获】
1). 使用REMIX编辑器进行Solidity语言编程,编译,运行,调试。
2). REMIX界面介绍

2. 使用REMIX编辑器执行"HELLO WORLD"的智能合约

REMIX是一个智能合约编程语言Solidity的集成开发环境。
最简单的入门就是进行"HELLO WORLD"的程序运行。

2.1 智能合约编译

在CHROME浏览器上点击链接REMIX官网浏览器版编辑器即可打开REMIX编辑器。部分不能正常访问官网的,可以访问笔者的国内REMIX编辑器
新增一个命名为“HelloWorld.sol”的文件,复制以下代码:

pragma solidity ^0.4.17;

contract Hello         
{
    address creator;     
    string greeting;     

    function Hello(string _greeting) public   
    {
        creator = msg.sender;
        greeting = _greeting;
    }
    

    function greet() public constant returns (string)           
    {
        return greeting;
    }
    
    function setGreeting(string _newgreeting) public
    {
        greeting = _newgreeting;
    }
    
     /**********
     Standard kill() function to recover funds 
     **********/
    
    function kill() public
    { 
        if (msg.sender == creator)
            suicide(creator);  // kills this contract and sends remaining funds back to creator
    }

}

 

 

点击"Start to compile"按钮,会得到一下结果:

0.智能合约编译.png

 

除一些函数的告警提示外,结果表明该智能合约编译成功。

2.1.1 编译告警

 

 

如果编写的程序有告警,REMIX会有提示。一般来说,提示不必修改。

REMIXD编译告警

2.1.2 编译错误

 

 

为了说明编译错误案例,把该文件的第17行"return greeting;"改为"return _greeting;", 重新编译,得到以下结果

REMIXD编译错误

如果编写的Solidity程序存在语法错误,Remix编译器会以粉红色底色提示显示错误原因,并在编辑器窗口提示位置。
编译错误演示完后,恢复第17行代码为"return greeting;"

2.1.3 详情信息

点击"Detail"按钮,可以看到详细信息。其中WEB3DEPLOY部分的内容就是在案例《第二课 如何实现以太坊最简智能合约“Hello World”的运行》中geth控制台使用的编译后代码。

DETAIL的内容

 

2.2 智能合约运行

1. 创建智能合约
选择“Run”的页面,选择Environment环境为Javascript VM,在“Create”按钮前输入框内输入"Hello World!"[注意:输入字符串一定要有英文双引号],点击“Create”按钮。

创建智能合约


2. 运行greet函数
点击浅蓝色函数"greet"按钮,可以看到输出结果为“Hello World!”

运行函数greet


说明:浅蓝色按钮函数表示该交易函数运行时不需要消耗GAS的。

 

3. 运行setGreeting函数
在setGreeting函数按钮的输入框输入内容"Hello Duncan!", 运行后在点击执行"greet"函数,发现该函数的输出内容已变为"Hello Duncan!"了,说明setGreeting执行正常。

运行函数SetGreeting


说明:粉红色按钮函数表示该交易函数运行时是需要消耗GAS的。

 

3. REMIX界面详解

第2章以“Hello World”为例,介绍了REMIX集成环境的基本使用方法。本章介绍REMIX编辑器的详细功能描述。

3.1 REMIX集成环境概述

REMIX是一个智能合约编程语言Solidity的集成开发环境,它集成了一个调试器和测试环境。
如果你对以下内容感兴趣,REMIX是一个不错的学习方式:
1,开发智能合约(REMIX集成了SOLIDITY编辑器)
2,调试智能合约
3,获取已运行合约的状态和属性
4,调试已经提交的合约
5,分析SOLIDITY代码,以便减少编码错误和加强最佳实践
6,配合Mist(或者任何植入web3的工具),REMIX可用于测试和调试DAPP分布式程序。(参考链接Debugging a Dapp using Remix - Mist - Geth 
详解介绍使用的程序案例为"ballot.sol"文件的代码,完整代码如下:

pragma solidity ^0.4.0;
contract Ballot {

    struct Voter {
        uint weight;
        bool voted;
        uint8 vote;
        address delegate;
    }
    struct Proposal {
        uint voteCount;
    }

    address chairperson;
    mapping(address => Voter) voters;
    Proposal[] proposals;

    /// Create a new ballot with $(_numProposals) different proposals.
    function Ballot(uint8 _numProposals) public {
        chairperson = msg.sender;
        voters[chairperson].weight = 1;
        proposals.length = _numProposals;
    }

    /// Give $(toVoter) the right to vote on this ballot.
    /// May only be called by $(chairperson).
    function giveRightToVote(address toVoter) public {
        if (msg.sender != chairperson || voters[toVoter].voted) return;
        voters[toVoter].weight = 1;
    }

    /// Delegate your vote to the voter $(to).
    function delegate(address to) public {
        Voter storage sender = voters[msg.sender]; // assigns reference
        if (sender.voted) return;
        while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)
            to = voters[to].delegate;
        if (to == msg.sender) return;
        sender.voted = true;
        sender.delegate = to;
        Voter storage delegateTo = voters[to];
        if (delegateTo.voted)
            proposals[delegateTo.vote].voteCount += sender.weight;
        else
            delegateTo.weight += sender.weight;
    }

    /// Give a single vote to proposal $(toProposal).
    function vote(uint8 toProposal) public {
        Voter storage sender = voters[msg.sender];
        if (sender.voted || toProposal >= proposals.length) return;
        sender.voted = true;
        sender.vote = toProposal;
        proposals[toProposal].voteCount += sender.weight;
    }

    function winningProposal() public constant returns (uint8 _winningProposal) {
        uint256 winningVoteCount = 0;
        for (uint8 prop = 0; prop < proposals.length; prop++)
            if (proposals[prop].voteCount > winningVoteCount) {
                winningVoteCount = proposals[prop].voteCount;
                _winningProposal = prop;
            }
    }
}

REMIX主界面截图如下,具体说明参考各个子章节。

REMIX主界面截图


具体界面介绍章节分类如下:
3.2 文件浏览器
3.3 Solidity语言编辑器
3.4 终端输出器
3.5 分页控制面板
3.5.1 编译合同
3.5.2 运行
3.5.3 调试
3.5.4 设置
3.5.5 分析
3.5.6 支持

 

3.2 文件浏览器

 

文件浏览器


1)增加新文件(Create new File)
点击在浏览器上增加一个新的智能合约文件

9.增加新文件.png

 

2)打开文件(Add Local File)

打开存在文件


3) 匿名发布到GitHub(Publish to Gist)

11. 匿名发布到GitHub.png

 

4) 复制文件列表到其他浏览器(Copy to another instance)
例如,把“http://remix2.ju3ban.net”的文件列表复制到另一个浏览器“http://remix.ju3ban.net
修改输入目标浏览器的网址:

12.复制到别的浏览器.png

 

 

 

打开新的浏览器,文件列表已复制过来了:

13.别的浏览器的文件列表.png

5)链接本地服务器(Connect to Localhost)
在Remix文件浏览器上的文件并不会同步到本地文件系统,对浏览器文件列表的新增/修改/删除并不会同步本地文件。一般操作时,调试成功的代码需要在本地文件系统新建文件保存。Remix浏览器提供了一种方法,就是使用Remixd,允许保存和同步浏览器文件到你的本地计算机中。因为根据官网文档,笔者没有能够在Windows 10系统或者Ubuntu中安装成功Remixd,本文不再详细介绍该功能。有兴趣的朋友欢迎根据官网文档尝试使用REMIXD同步。成功者欢迎跟辉哥反馈交流,补充完整这个文档。

14. 链接本地文件系统.png

3.3 Solidity语言编辑器

15. Solidity 浏览器.png

Solidity语言编辑器重要的功能列表:
1,TAB页面显示打开的文件
2,编译告警或者错误会显示在编辑器最左侧边
3,Remix自动保存当前文件(修改后5秒内)
4,+/- 表示增加/减少编辑器的字体大小

3.4 终端输出器

终端输出器窗口

终端输出器功能说明:
1,点击1按钮可隐藏终端输出器
2,点击2按钮可情况输出器内容
3,点击3按钮可复制地址信息等到缓存,便于粘贴
4,点击Details按钮可展开交易详细内容
5, 点击Debug按钮可调试该交易合约
6, 点击复选框,可增加选择显示所有的交易还是只显示智能合约相关的交易程序。默认只显示后者。

17. 终端显示内容.png


7,输入关键字可搜索定位输出内容
例如输入"Hello "关键字,相关的内容就显示出来了。

18. 搜索Hello关键字


8,监听网络(Listen to network)
勾选后,REMIX不仅监听REMIX编辑器中创建的交易,还监听当前环境中所有的交易。

 

3.5 分页控制面板

3.5.1 编译合约

20. Compile控制面板.png

1,发布到Swarm网络(Publish on Swarm)
点击“Publish on Swarm”按钮可把智能合约源码和对应的ABI信息发布到网络上。这个合约智能是非抽象类的才能发布。
合约发布后,你可以点击Detail按钮,在弹出窗口的“SWARM LOCATION”
位置找到对应的MetaDATA信息。
信息中的SWARM LOCATION位置有对应网址,在能科学上网的计算机就可找到该合同的MetaData信息 “bzzr://165fad4c3d8ead3a7fe28296777b4bedafb09bb57de2e9ba39c1547866437182

3.5.2 运行

21. Run控制面板.png

重点特性说明
1) 环境选择
JavaScript VM: 所有交易在浏览器的沙盒中被执行。这以为着没有结果是永久保存的。当页面重载后,一个新的区块链会被从零开始运行,老的会被丢弃。
Injected Provider: Remix将连接被植入的Web3对象。例如Mist或者Metamask钱包是提供植入的Web3对象的例子。例如《第八课 如何调试以太坊官网的智能合约众筹案例》就是使用Meta的账号。
Web3 Provider: Remix将连接到一个远程节点。你可以用这个地址来选择钱包客户端:geth, parity or any Ethereum client.

2) 初始化合约
1] 创建合约
“Create”按钮用于创建合约。合约创建时,需要参考左边构建函数定义(智能合约的同名函数为构建函数)的类型来输入参数。

25. 创建合约.png


注意:如果输入参数为地址或者字符串,都需要使用英文双引号("")囊括起来,使用英文(",")表示输入参数分割。

 

2] 运行合约
假设给出的地址是一个选择合同的实例。通过这种方法就可以跟已经运行的合同进行交互。要特别谨慎使用该功能,因为系统不做验证。运行时要确认信任这个地址的合同。

3] 等待(pending)合约

26,挂起合约.png

 

等待合约表示还没有完成执行过程的合约。按钮功能描述参考上述附件。

3.5.1.1 Web3 Provider远程节点配置

1) 启动Ganache客户端。不熟悉的,可参考该篇文章的对应关键字“在WINDOWS上安装Ganache”安装好客户端。

22. 启动Ganache客户端.png

 

 

 

2) 输入Web3 Provider远程节点,例如Ganache的签宝地址为“HTTP://127.0.0.1:7545”

23. 输入WEB3 privider的服务器地址.png

3) 输入完成后,Remix的账号列表更新为Ganache的账号列表了。

 

24. 账号为Ganache的账号列表.png

3.5.3 调试

调试/回滚和单步调试是一个很重要的功能,点击《第九课 如何在Remix环境下进行Solidity代码单步调试》文章查看。

3.5.4 设置

 

27. Settiongs.png


重要特性说明:
(1)Solidity version:编译SOLIDITY版本,不调整的话系统会默认选择最新正式发布的版本。
(2)Always use Ethereum VM at Load:勾选此项会在重新加载时默认选择JavaScript VM环境。
(3)Enable Optimization:勾选此项会节省运行GAS,JVM等测试环境可不用勾选。

 

3.5.5 分析

分析面板显示的是最后一次编译的信息,默认情况下每一次编译都会产生一个新的分析。

 

这个分析面板显示的是合约代码的详细信息,它可以帮助你避免代码错误或者增强编码能力。

28. Analysis页面.png

Security:
Transaction origin: 如果tx.origin被使用则会告警;
Check effects: 避免潜在的可重入性BUG;
Inline assembly: 使用植入汇编方式;
Block timestamp: Semantics maybe unclear;
Low level calls: Semantics maybe unclear;
Block.blockhash usage: 自毁调用;
Gas & Economy:
Gas costs: 函数的GAS消耗太高会告警。
This on local calls: 勾选后本地函数会被唤醒;
Miscellaneous:
Constant functions: 检查潜在的常量函数
Similar variable names: 检查变量名是否太相似

Miscelllaneous下方显示的是本次编译的优化告警,供程序员优化代码使用。

 

28. Analysis页面2.png

3.5.6 支持

支持页面,可点击需求技术支持和交流。

 

remix_supporttab

4.典型错误介绍

4.1 REMIX编译器官网链接打不开

提示内容:点击官网链接(http://remix.ethereum.org),如果打不开或者有错误提示“mock compiler: source not found”
原因分析: 这个主要是不能科学上网引起官网浏览器不能下载完全。
解决办法:
1,参考欧阳哥哥的文章《【以太坊开发】Remix IDE本地部署与配置个性风格》完成本地REMIX的部署;
2,采用一个已国内部署的REMIX浏览器链接:http://remix2.ju3ban.net

4.2 参数转换失败

提示内容: 终端输出器显示为“transact to Donation.moveFund errored: Error encoding arguments: Error: Assertion failed ”
原因分析:
Solidity函数定义为"function moveFund(address _to, uint _amount)"
RUN面板的函数输入参数如下,希望转移5个ETH给目标账号。

"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",500000000000000

结果提示错误。
这个原因主要是因为”5 *10^18”的值超过了计算器的范围,需要增加""来让程序进行转换。Solidity的默认单位为wei,1 ETH = 1*10^18 wei。
解决办法:
输入参数改为2个参数均有双引号则不会有错误提示。

"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","500000000000000"

在remix中,任何输入参数都可以带""表示。

5.参考文档

1),REMIX英文官网帮助文档
2), 【以太坊开发】Remix IDE本地部署与配置个性风格
3), SOLIDITY语言官网中文版

版权声明:本文为ffzhihua原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ffzhihua/article/details/81198208

智能推荐

VSCode编辑器中对PHP语言的支持

1、编辑器的下载: 2、根据需要下载中文语言包 3.安装插件 easy less(CSS样式) One Monokai Theme(VSCode主题) PHP Debug (需要安装PHP扩展) PHP IntelliSense(增强VSCode对PHP语法支持提示) Sublime Text Keymap and Settings Importer(Sublime的一些快捷键使用) Vetur(...

C语言工程实践-简单文本编辑器

废话不多数,先来简单展示下程序界面。 学完C后老师要求写个大点的项目,当时就随便选了这个,结果发现难度还是有点大的,别人写个小游戏就三四百行,我这个给整成快800行了^_^,不过最终还是写出来了,由于初次学习C语言,编程能力有限,代码写的可能不够漂亮,但还是决定拿出来分享下。供有需要的同志提供借鉴。 环境: Windows10系统+Visual Studio 2017 Community...

编辑器写C语言输出中文乱码记录

记录 在写C语言时,有时候需要使用printf输出中文,如果使用IDE来写代码,例如使用VisualStudio,输出中文没有问题。但是当使用编辑器+编译器的方式写代码,在这个环境下输出中文可能会遇到中文输出乱码。 环境 编辑器:VSCode 编译器:Mingw-w64 C语言代码: 代码说明:上述代码的主要作用是读取文件的内容,并将读取内容输出在屏幕上 文件内容: 说明:test.txt 文件是...

顺手的Go语言编辑器

为什么80%的码农都做不了架构师?>>>    前段时间一直在 vim,goide,liteide,xcode ...各种go语言编辑器中比较...终于找到自己顺手的IDE了... 他就是大名鼎鼎的IntelliJ IDEA 熟悉java的童鞋一定不会陌生吧.. idea是通过一个插件支持go语言的高亮语法,代码提示和重构实现. 先去上面的地址下载.idea支...

python学习0809

while True : n=int(input(‘请输入起始值’)) m=int(input(‘请输入终止值’)) if m>n : break else: print(‘输入不规范,请重新输入’) a=[] while True: a.append(int(input(‘请输入公因数,按0停止&rsquo...

猜你喜欢

在element-ui的table组件与双大括号中使用时间处理函数

需求1:在双大括号中处理时间格式 使用前: 使用前页面效果: 使用后代码: 全局注册过滤器 使用后页面效果:   需求2:在element-ui的table组件中处理时间格式 使用前代码: 使用前页面效果: 使用后代码: 当前组件的methods中 使用后页面效果:   说明:在element-ui的table组件中,自带属性formatter,用来格式化内容   &...

spring cloud 使用sleuth +zipkin 实例测试

最近研究 spring cloud sleuth,这里使用3个应用,sleuth-server,另外就是sleuth-provider和sleuth-consumer, 源码是参考这个兄弟的http://www.cnblogs.com/skyblog/p/6213683.html,但是使用他的源码没有成功,是有问题滴,所以,亲测自己项目, 这是基本的配置,大神勿喷啊,小弟也不才, 直接代码: 1:...

SpringCloud微服务实战之服务消费者Ribbon+RestTemplate

Eureka服务治理体系中有3个核心角色:服务注册中心、服务提供者、服务消费者。spring cloud的服务调用又分为两种方式:ribbon+RestTemplate和feign,本篇主要说的是ribbon+restTemplate方式。 Spring Cloud Ribbon是基于Http和Tcp协议的客户端负载均衡工具,基于Netflix Ribbon实现,它只是一个工具类,不需要独立部署。...

【pytest】pdb 调试

pdb 调试: pdb 是 Python 标准库的调试模块。在 pytest 中,可以直接使用 --pdb 参数在测试失败时开启调试;  直接使用 --pdb 参数: 断言失败,进入 pdb: pdb 提示符出现后,便可以使用 pdb 的交互调试功能,查看错误时,有以下常用命令: &nbs...

自动化测试之cucumber.md

一、简介 cucumber是BDD(Behavior-driven development,行为驱动开发)的一个自动化测试的副产品。它使用自然语言来描述测试,使得非程序员可以理解他们。Gherkin是这种自然语言测试的简单语法,而Cucumber是可以执行它们的工具。关于BDD有兴趣自行了解。附cucumber官网链接,里面也有关于BDD的信息。 cucumber本质上是使用根据正则表达式匹配自然...