博客
关于我
链乔教育在线|智能合约学习——以太坊智能合约学习笔记(四)
阅读量:483 次
发布时间:2019-03-06

本文共 2479 字,大约阅读时间需要 8 分钟。

链乔教育在线|智能合约学习——以太坊智能合约学习笔记(四)

使用MetaMask钱包连接以太坊私链,并编写一个基本的提币智能合约部署到以太坊私链上,进行调用。

一、浏览器安装MetaMask插件

由于Google插件访问经常会打不开网页,本次以Edge为例来进行说明,Filrefox操作类似。

  • 打开浏览器扩展商店:搜索MetaMask安装即可。
  • 安装完毕后,浏览器会有一个小的MetaMask图标点击后可以展开菜单,或使用展开视图来打开网页方式访问。

    1. 使用MetaMask
    2. (1)欢迎页:

      (2)第一次使用时会提示导入钱包或者创建钱包,导入钱包或创建钱包均会提示协议。

      创建钱包需要输入初始访问密码。

      导入钱包则可以使用助记词进行导入。

      1. MetaMask连接测试用私链。
      2. (1)启动以太坊私链:

        搭建私链可以参考:

        由于这次需要使用钱包来连接私链,因此私链节点在启动时,需要有一个节点启动RPC服务才行。

        geth --datadir data --networkid 20210322 --rpc --rpcaddr "0.0.0.0" --allow-insecure-unlock console

        –networkid: 必须与初始化JSON文件中的chainID一致,否则钱包会出现连接不上或者转账问题。

        –rpc 启动RPC服务,默认端口是8545。

        –rpcaddr “0.0.0.0” ,由于默认情况下RPC服务的监听IP是127.0.0.1,即仅限于本机访问,因此需要将限制IP设置为"0.0.0.0",以设置允许任意IP地址访问。

        –allow-insecure-unlock ,笔者使用Geth/v1.10 来搭建的私链,出于安全原因,新版本的geth已经不允许使用personal.unlockAccount()方式进行账户解锁,如果在了解风险的前提下希望使用此类解锁,则需要增加此启动参数,否则会抛异常,如:Error: account unlock with HTTP access is forbidden at web3.js:6347:37

        (2)打开MetaMask设置-网络:

        点击右上角的添加网络按钮,新增一个网络,输入网络名称、PRC URL、链ID、点击保存即可。

        (3)转账给钱包:

        可以在私链里设置矿工账号进行挖矿操作,挖到矿之后可以向钱包等地方进行转账操作,转账说明在之前的文章 里有说明。下图是转账后的效果。

        二、合约创建与部署

        Solidity合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个EVM函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量就不能访问了。

      3. 创建合约:
      4. 创建合约有两种方式:一种可以通过以太坊交易从外部创建合约,也可以从Solidity合约内部创建合约。我们可以利用一些集成开发环境如Remix、VSCode、Atom等来进行创建,开发环境配置请参考之前的文章:。使用编程方式创建的话,最好的办法是使用JavaScriptAPI:web3.js来进行编码创建,web3.js提供了一个web3.eth.Contract的方法能够更简单的创建合约。

        创建智能合约需要调用智能合约的构造函数(使用constructor来声明),当我们调用此函数时即创建一个智能合约,该函数在合约内只会执行一次,并且该函数不支持重载,在一个合约内部,仅允许出现一个构造函数。

        构造函数执行完毕后,合约的最终代码将部署到区块链上。此代码包括所有公共和外部函数以及所有可以通过函数调用访问的函数。 部署的代码没有包括构造函数代码或构造函数调用的内部函数。

        在内部,构造函数参数在合约代码之后通过二进制接口编码(ABI编码)的形式进行传递,不过通常我们开发时使用web3.js,因而不需要关心这个问题。

        如果一个合约想要创建另一个合约,那么创建者必须知晓被创建合约的源代码(和二进制代码)。 这意味着不可能循环创建依赖项。

        我们来写一个简单的合约代码:

        // SPDX-License-Identifier: GPL-3.0pragma solidity >=0.4.16 <0.9.0;contract Faucet {    function send(address payable owner, uint amount) public {        owner.transfer(amount);    }    receive() external payable {    }}

        这里创建了一个简单的合约结构,只实现了一个简单的功能,即调用send接口函数时,向某个地址发送一定数量的通证代币。下面那个匿名函数是为了保证合约可以接受转账的必要返回函数,有且只能有一个。

        在Remix中创建合约文件,点击新建按钮创建一个合约。

        编写代码:

        在Remix中编写上述代码,点击左侧导航第二个按钮,切换到编译器,这里可以将源代码文件编译成二进制文件用于部署到以太坊私链,可以设置自动编译。

        部署合约:

        切换到部署界面,将environment选择为InjectedWeb3,此时,需要点击MetaMask来连接Remix,如果没有连接钱包,则无法显示账户,亦无法实现部署。

        点击部署按钮,MetaMask会弹出交易提示窗口,提示交易信息。

        确认后在活动界面会显示合约处于待处理中。

        如果此时有矿工在挖矿即可确认交易并部署合约到链上,如下图所示,合约已部署完毕。

        调用合约:

        在部署界面,可以看到已部署成功的合约。

        点击合约前的图标即可展开合约调用界面可以看到合约里定义的send函数。

        传入参数进行调试。

        最后,这篇笔记详细记录了从开始的MetaMask安装,到连接私链,再到创建、部署和调用智能合约的全过程。通过本文的操作,读者可以初步掌握使用MetaMask连接以太坊私链并部署自动化合约的基本技能。

    转载地址:http://joodz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    Mysql 拼接多个字段作为查询条件查询方法
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>