您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页第十课 Solidity语言编辑器REMIX指导大全

第十课 Solidity语言编辑器REMIX指导大全

来源:二三娱乐

1. 文章摘要

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

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

2.1 智能合约编译

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的内容

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集成环境概述

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
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 12.复制到别的浏览器.png 打开新的浏览器,文件列表已复制过来了: 13.别的浏览器的文件列表.png 14. 链接本地文件系统.png

3.3

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

3.5.2

21. Run控制面板.png

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

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

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

3] 等待(pending)合约

26,挂起合约.png

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

3.5.1.1 Web3 Provider远程节点配置

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

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编译器官网链接打不开

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.参考文档

尊重知识输出,如需引用,敬请说明本文链接和作者-笔名辉哥。

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务