以太坊:从入门到实践

Posted 2018065816申富元

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊:从入门到实践相关的知识,希望对你有一定的参考价值。

以太坊简介

以太坊是一个开放的有智能合约功能的公共区块链平台,通过其专用加密货币以太币提供以太虚拟机处理去中心化合约应用。以太坊将其程序智能合约存储于区块链上,通过挖矿节点执行,将以太币作为奖励(gas)交付给矿工,具有图灵完备性(可以解决所有的可计算问题)。

智能合约

由于智能合约存储在区块链上,具有自己的账户地址。因此它是“规则公开透明,合约内的规则以及数据对外部可见;所有交易公开可见,不会存在任何虚假或者隐藏的交易”的公开透明程序。智能合约由交易驱动,每一笔发送给智能合约的交易都包含与合约相关的信息,驱动合约代码执行。由于智能合约具有账户,因此它不但可以处理信息,还可以接受、储存和发送价值。其工作示意图如下:

合约工作图
图灵完备的以太坊智能合约的功能几乎没有边界,这使得其适用范围也几乎没有边界。
鉴于智能合约公平公开易监管不易瘫痪的特性,以智能合约开发的DAPP(去中心化应用)得到了广泛应用。由于区块链只能新增不能删除和修改,且附有强大的共识机制,使得智能合约抗干扰、可追溯的优势更为突出。运行于以太坊上的智能合约代码避免了中心化带来的开销和安全问题,使得DAPP成本低廉、运行高效。
智能合约编译后会产生ABI(应用程序二进制接口),描述合约字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等。ABI接口为调用者提供函数属性与参数属性,同时可以与合约地址一起形成合约实例以便调用。

EVM

EVM(以太坊虚拟机)是一个完全独立的沙盒,合约代码可对外完全隔离并在EVM内部运行。EVM可以将区块链主链与运行环境隔离,方便智能合约的创建与测试。交易被输入EVM后,EVM会确认转账是否有正确的数值,确认签名的有效性以及是否转账nonce符合特定转账数量的nonce。如果有误差,转账会被作为错误返回。之后矿工运行节点会收取固定的gas,数额以交易字节数为单位。在执行交易之前,交易会被转化为合约类型,之后进入解释器执行,执行的每一步均需要收取相应的gas.有了以太坊虚拟机和智能合约,你可以通过简单地点击按键,就可以在全球进行交易,而且还无需任何中介,因此也避免了多余的费用。

实践

以太坊开发相关实践主要集中在编写智能合约、部署智能合约以及与智能合约交互的过程中。智能合约的编写主要采用Solidity语言,可借助不同的框架等技术实现部署、测试与交互。我在学习的过程中通过Metamask+Truffle+Ganache实现了部署与测试,由于选择Truffle的官方webpack项目测试时缺少相应的引导吃了不少苦头,这里讲一下官方文档没有的东西,希望以后可以长进。

Solidity编写合约

Solidity官方文档.
solidity语言与java、c++很像,只是有一些合约相关的变化,以下是官方代币合约代码。

pragma solidity >=0.4.21 <0.7.0;
import "./ConvertLib.sol";
contract MetaCoin {
    mapping (address => uint) balances;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    constructor() public {
        balances[msg.sender] = 10000;
    }

    function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
        if (balances[msg.sender] < amount) return false;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Transfer(msg.sender, receiver, amount);
        return true;
    }

    function getBalanceInEth(address addr) public view returns(uint) {
        return ConvertLib.convert(getBalance(addr),2);
    }

    function getBalance(address addr) public view returns(uint) {
        return balances[addr];
    }
}

在代码开头先要声明solidity版本,truffle使用编译器版本为0.5.16,

pragma solidity >=0.4.21 <0.7.0;

truffle版本可以在truffle-config.js文件中查到:

 compilers: {
    solc: {
       version: "0.5.1",    // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    }
  }

在该文件中引入别的sol文件需要显示import并在部署时进行链接,否则会报错。

import "./ConvertLib.sol";

链接代码在migrations文件夹下的js文件中

 deployer.link(ConvertLib, MetaCoin);

声明合约,相当于类

contract MetaCoin {

event是动作接口。

 event Transfer(address indexed _from, address indexed _to, uint256 _value);

Truffle配置

快速入门 Truffle.
找到truffle-config.js文件修改端口号和网络id为Gnanche的端口号和网络id,可以在Ganache里自己设置。
在这里插入图片描述
在这里插入图片描述

Metamask

matamask.
提取码:tf2f
metamask官网谷歌插件下载连接我怎么也打不开,这里提供一个下载。metamask是一个以太坊钱包,可以交易以太币。这里主要将它作为web-provider连接web3.小狐狸很可爱。
在这里插入图片描述
小狐狸脑袋会随光标移动而移动。
需要自定义连接的端口来连Ganache
在这里插入图片描述
在这里插入图片描述
具体内容同truffle配置。

Web3

Web3.js API 中文文档
js代码与合约交互采用web3.js

  const networkId = await web3.eth.net.getId();
      const deployedNetwork = metaCoinArtifact.networks[networkId];
      this.meta = new web3.eth.Contract(
        metaCoinArtifact.abi,
        deployedNetwork.address,
      );

交互的核心采用 web3.eth.Contract获取合约实例,这样就可以调用合约的方法了。
调用方法时如果没成功,很有可能是部署不成功没生成地址。可以看bulid文件夹下相应的json文件,拉到最底下找networks

"networks": {
    "5777": {
      "events": {},
      "links": {
        "ConvertLib": "0x3E6f048Ef226B131F1A9aB8a62FE5BC18F0397db"
      },
      "address": "0x1914d3349699a5EbF7383D95a93569E0B3288912",
      "transactionHash": "0xa4a64381b4b11ca27892b9cd3b57a2aeb647d433be03676e981d655fe13b6e93"
    }
  },

如果是空的就是没部署。
abi还可以直接复制粘贴到js文件里,就在json文件开头。

部署与测试

部署与测试时我在官方项目中没遇到问题,但在自己写的项目中遇到了大量的问题。truffle通过编译与部署后运行环境时遇到的大量问题困扰了我好几天,见着拆招很是痛苦,在这里归纳一下。

npm ERR! code EPERM npm ERR! syscall unlink npm ERR! ERRNO -4048

更新npm无用,需要删除项目下的package-lock.json

WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' f

在webpack.config.js文件中添加mode属性即可。

'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

这个遇到了很多次,有三种情况,第一种是npm install装上包就没事了,第二种是因为webpack与webpack-dev-server版本冲突,降到webpack3与webpack-dev-server2解决,偶尔直接npm install webpack-dev-server能直接装好,大多数状况不行,有时候会解决后出现另外的错。

gyp ERR! build error gyp ERR! stack Error: `C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\msbuild.ex

cnpm install 解决。

gyp ERR! find Python

需要装python2.7,框架不支持高版本python。
本文为哈尔滨工程大学计算机学院2021年区块链技术课程课程设计选做内容,
作者为2018065816申富元

以上是关于以太坊:从入门到实践的主要内容,如果未能解决你的问题,请参考以下文章

以太坊开发入门,完整入门

以太坊是啥丨以太坊开发入门指南

[以太坊源代码分析] V. 从钱包到客户端

以太坊是什么 - 以太坊开发入门指南

以太坊是什么 - 以太坊开发入门指南

以太坊是什么 - 以太坊开发入门指南