暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【以太坊实战】Remix +Solidity实现水龙头智能合约

知否Tech 2020-09-23
2249


 之前通过MetaMask进行以太币的交易流程,现使用Remix编写合约的形式进行以太币交易。




01

使用remix编码




以太坊有许多不同的高级语言,所有这些语言都可用于编写合约并生成 EVM 字节码。到目前为止,一种高级语言是智能合约编程的主要语言:Solidity。Solidity 由 Gavin Wood创建,并已成为以太坊及其他地区使用最广泛的语言。我们将使用 Solidity 编写我们的第一份合约。

登录remix官网

http://remix.ethereum.org/



点击文件File explorer ,选择加号进行添加新的源文件。



    //build version


    pragma solidity ^0.4.19;


    //My first contract is a faucet!


    contract Fauset{
    Give out ether to anyone who asks


    function withdraw(uint winthdraw_amount) public {
    limit winthdraw_amount,0.1 ether


    require(winthdraw_amount <= 100000000000000000);
    send the amount to the address winthdraw_amount required winthdraw_amount


            msg.sender.transfer(winthdraw_amount);


    }


    回调函数


    Accept any incoming amount


    function() public payable{}


    }



    注释供人阅读,不包含在可执行 EVM 字节码中。我们通常在我们试图解释的代码之前将它们放在行上,或者有时在同一行上。注释以两个正斜杠//开头。从斜线到超出的所有内容,直到该行的结尾,都被视为空行并被忽略。

    好的,下一行是我们实际合同开始的地方:

    contract Faucet {

    该行声明了一个合约对象,类似于其他面向对象语言(如 JavaScript,Java 或 C ++)中的类声明。合约定义包括定义范围的花括号{}之间的所有行,就像在许多其他编程语言中使用花括号一样。

    接下来,我们声明水龙头合约的第一个功能:

    function withdraw(uint withdraw_amount) public {

    该函数名为 withdraw,它接受一个名为 withdraw_amount 的无符号整数(uint)参数。它被声明为公共函数,这意味着它可以被其他合约调用。函数定义遵循花括号:

    require(withdraw_amount <= 100000000000000000);

    提现功能的第一部分设定了提款限额。它使用内置的 Solidity 函数 require 来测试一个前提条件,即 withdraw_amount 小于或等于 100000000000000000 wei,这是 ether 的基本单位,相当于 0.1 ether。如果使用大于该数量的 withdraw_amount 调用 withdraw函数,则此处的 require 函数将导致合约执行停止并因异常而失败。

    这部分合约是我们水龙头的主要逻辑。它通过限制提款来控制合约之外的资金流动。这是一个非常简单的控制,但可以让你一瞥可编程区块链的力量:控制资金的去中心化软件。接下来是实际提现:

    msg.sender.transfer(withdraw_amount);

    这里有一些神奇的东西:msg 对象,这是所有合约都可以访问的输入之一。它表示触发此合约执行的交易。属性 sender 是交易的发件人地址。函数传递是一个内置函数,它将以太从合约传递到调用它的地址。向后读,这意味着转移到触发此合约执行的 msg 的发送者。传递函数将金额作为其唯一参数。我们将 withdraw_amount 值作为参数传递给上面几行声明的 withdraw 函数。


    下一行是结束大括号,表示我们的 withdraw 函数定义的结束。

    下面我们再声明一个功能:

    function () public payable {}

    此函数是所谓的“回退”或默认函数,如果触发合约的交易未命名合约中的任何已声明函数或任何函数或未包含数据,则调用此函数。合约可以有一个这样的默认函数(没有名称),它通常是接收以太的函数。这就是为什么它被定义为公共和默认函数,这意味着它可以接受以太合约。除了接受以太之外,它没有做任何事情,如花括号{}中的空定义所示。如果我们创建一个将 ether 发送到合约地址的交易,就好像它是钱包一样,这个函数将处理它。

    在我们的默认函数下面是最后的结束花括号,它表示了合约 Faucet 的定义结束。




    02


    编译部署


    选择编译器版本,选择自动编译,编写demo后进行编译。

    默认的界面可以划分为 4 个区域:

    文件目录:这里有新建文件、从本地打开文件等按钮,可以直观的看到当前编辑过哪些合约文件,以及删除、重命名这些文件;

    代码编辑:是使用频繁的区域,提供了语法高亮、自动完成等功能,左上角的加号和减号可以调整编辑器字体,即使刷新浏览器这些代码也不会丢失,因为 Remix 把配置和源代码都保存在了浏览器的 LocalStorage 里面;

    调试工具:是使用频繁的区域,提供了智能合约的编译、运行、单步调试、编译器选项配置等功能;

             调试输出:会打印出所有测试活动产生的日志,比如部署智能合约,调用智能合约函数过程中的各种交易;除了代码区域之外的 3 个区域都是可以折叠起来的,点击要折叠的区域和代码区域相邻边上的双尖括号即可实现折叠。



    编译成功后,点击左侧边栏的deploy& run transactions,进行配置,选择运行环境,运行网络,账户信息,Gas limit等信息,然后点击deploy,等待几分钟后,日志及左下角会有已部署成功的合约显示。



    可以通过etherscan预览刚刚部署的合约



    合约的编译字节码预览



    重复点击部署,即可得到不同的合约及地址




    03


    准备及执行


    因当前合约新建,没有ether,故先使用MetaMask给合约充值。

    复制合约地址,以便交易时填写



    发送ETH



    刷新合约,可以查看到最近一笔转账



    现合约内已有以太,现在可以执行合约获取0.1ETH。即100000000000000000 wei



    可以看到由账户发往水龙头合约的交易已完成



    如需查看本次交易的转账情况,还需点击内部交易(Internal Txns)查看




    03


    小结


        本次使用Solidity 写了一个水龙头合约,然后使用 Remix IDE 将合约编译为 EVM 字节码;我们使用 Remix 进行交易,并在 Ropsten 区块链上记录了水龙头合约。

        一旦记录下来,水龙头合约就有一个以太坊地址,我们给它发了一些 ether。最后,我们构建了一个交易来调用 withdraw 函数并成功请求 0.1 ether。合约检查了我们的请求,并通过内部交易向我们发送了 0.1 以太。


    文章转载自知否Tech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论