主页 > imtoken钱包地址转账查询 > 以太坊教程:搭建环境,编写编译智能合约

以太坊教程:搭建环境,编写编译智能合约

imtoken钱包地址转账查询 2023-04-07 05:50:58

本以太坊教程主要介绍:搭建开发环境,编写编译智能合约。

什么是以太坊

以太坊是一个具有智能合约功能的开源公共区块链平台。 通过其专用的加密货币 Ether,它提供了一个分散的虚拟机(“以太坊虚拟机”)来处理点对点合同。

以太坊的概念最初是由程序员Vitalik Buterin在2013年至2014年间受到比特币的启发后提出的,意为“下一代加密货币和去中心化应用平台”。 它于 2014 年通过 ICO 众筹开始发展。以太坊目前是市值仅次于比特币的第二大加密货币。

什么是以太坊区块链?

以太坊区块链有两个主要组成部分:

可以简单理解,以太坊区块链的作用就是存储数据和代码,并在EVM(Ethereum Virtual Machine,以太坊虚拟机)中执行代码。

准备基础

为了进行以太坊开发,您应该对以下语言/技术有基本的了解:

为了构建以太坊去中心化应用,即Dapp(Decentralized application),以太坊有一个非常方便的JavaScript库,即web3.js,也可以在一些js框架中直接引入这个库来构建应用,比如react,angular,等等。

示例:以太坊投票应用程序

在以太坊教程示例中,我们将构建一个简单的去中心化投票应用程序。 所谓去中心化应用,就是不只存在于中心化服务器上​​的应用。 网络中有数十万台计算机,会有如此多的应用程序副本在运行,这使得几乎不可能出现停机。 您将构建一个投票应用程序,在该应用程序中,您可以初始化候选人进行选举,并对候选人进行投票,这些投票将记录在区块链上。 您将完成编写投票合约、将其部署到区块链并与之交互的过程。 您将了解什么是合约,以及在区块链上部署合约并与之交互意味着什么。

本质上,区块链就像一个分布式数据库,维护着一个不断增长的记录链表。 如果你熟悉关系型数据库,你应该知道一个表中有很多行数据。 现在,分批处理数据(比如每批 100 行)并连接每个已处理的批次。 可以形成区块链! 在区块链中,每批数据称为一个区块,区块中的每一行称为一个交易。

现在您对以太坊有了基本的了解,我们可以开始构建投票 dapp。 这将加强您对以太坊的了解,并让您大致了解其功能。

搭建以太坊开发环境

Linux

例子是在Ubuntu 16.04下搭建学习环境。 只需要成功安装nodejs和npm就可以进行下一步的项目了。

我们通过 npm 安装 ganache 和 web3 包来支持以太坊教程。 我们还需要安装 solc 来编译合约。

下面是安装过程:

$ sudo apt-get update
$ curl -sL https://deb.nodesource.com/setup_7.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt-get install nodejs
$ node --version
v7.4.0
$ npm --version
4.0.5
$ mkdir -p ethereum_voting_dapp/chapter1
$ cd ethereum_voting_dapp/chapter1
$ npm install ganache-cli web3@0.20.1 solc
$ node_modules/.bin/ganache-cli

如果安装成功,运行命令node_modules/.bin/ganache-cli,你应该能够看到下面的输出。

Ganache CLI v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
(1) 0x353d310bed379b2d1df3b727645e200997016ba3
(2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
(3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
(4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
(5) 0xda695959ff85f0581ca924e549567390a0034058
(6) 0xd4ee63452555a87048dcfe2a039208d113323790
(7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
(8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
(9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
Private Keys
==================
(0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
(1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
(2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
(3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
(4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
(5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
(6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
(7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
(8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
(9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
HD Wallet
==================
Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545

出于测试目的,ganache 默认创建 10 个账户,每个账户有 100 个以太币。 如果你还不知道账户是什么,就把它想象成一个用来存钱的银行账户(以太币(Ether,ETH)是以太坊生态系统中的货币/货币)。 您需要使用此帐户来创建交易、发送/接收以太币。

苹果系统

如果您没有安装 Homebrew比特币具备智能合约功能,请按照 Homebrew 中的说明进行安装。 homebrew 是一个包管理器,可以帮助我们安装开发所需的所有其他软件。 按照下面的说明安装所有其他必需的包。

$ brew update
$ brew install nodejs
$ node --version
v7.10.0
$ npm --version
4.2.0
$ mkdir -p ethereum_voting_dapp/chapter1
$ cd ethereum_voting_dapp/chapter1
$ npm install ganache-cli web3@0.20.1 solc
$ node_modules/.bin/ganache-cli

我们通过 npm 安装 ganache 和 web3 包。 我们还需要安装 solc 来编译合约。

如果安装成功,运行命令node_modules/.bin/ganache-cli,你应该能够看到右侧显示的输出。

Ganache CLI v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
(1) 0x353d310bed379b2d1df3b727645e200997016ba3
(2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
(3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
(4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
(5) 0xda695959ff85f0581ca924e549567390a0034058
(6) 0xd4ee63452555a87048dcfe2a039208d113323790
(7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
(8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
(9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
Private Keys
==================
(0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
(1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
(2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
(3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
(4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
(5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
(6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
(7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
(8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
(9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
HD Wallet
==================
Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545

出于测试目的,ganache 默认创建 10 个账户,每个账户有 100 个以太币。 如果你不知道以太坊账户是什么,就把它想象成一个用来存钱的银行账户(以太币(Ether,ETH)是以太坊生态系统中的货币/货币)。 您需要使用此帐户来创建交易、发送/接收以太币。

视窗

稳固合约

现在 ganache 已安装并运行,我们将开始编写我们的第一个以太坊智能合约。

我们将使用 solidity 编程语言来编写合约。 如果您熟悉面向对象编程,那么学习用 solidity 编写合约应该非常简单。 我们将编写一个名为 Voting 的合约(你可以将合约想象成面向对象编程语言中的一个类),它有以下内容:

当您将合约部署到区块链时,构造函数会被调用,而且只会调用一次。 与web世界中每次部署代码都会覆盖旧代码不同,部署在区块链上的合约是不可变的,也就是说,如果你更新合约并重新部署,旧合约仍然会存在于区块链上,并且数据还在。 新的部署将创建一个新的合约实例。

pragma solidity ^0.4.18;
contract Voting {
  mapping (bytes32 => uint8) public votesReceived;
  bytes32[] public candidateList;
  function Voting(bytes32[] candidateNames) public {
    candidateList = candidateNames;
  }
  function totalVotesFor(bytes32 candidate) view public returns (uint8) {
    require(validCandidate(candidate));
    return votesReceived[candidate];
  }
  function voteForCandidate(bytes32 candidate) public {
    require(validCandidate(candidate));
    votesReceived[candidate]  += 1;
  }
  function validCandidate(bytes32 candidate) view public returns (bool) {
    for(uint i = 0; i < candidateList.length; i++) {
      if (candidateList[i] == candidate) {
        return true;
      }
    }
    return false;
   }
}

将右边的代码复制到一个名为Voting.sol的文件中,并保存在chapter1目录下。

代码和解释

您还会注意到每个函数都有一个可见性说明符(例如本例中的 public)。 这意味着可以从合约外部调用函数。 如果不想让别人调用这个函数,可以把它设为私有函数。 如果您不指定可见性,编译器将发出警告。 最近,solidity编译器做了一些改进。 如果用户忘记标记私有函数而私有函数可以被外部调用比特币具备智能合约功能,编译器就会捕获这个问题。 所有可见性说明符都可以在这里看到。

您还会看到某些函数的修饰符视图。 它通常用于告诉编译器该函数是只读的(即调用该函数时不会更新区块链状态)。 所有修改器都可以在这里看到。

编译智能合约

我们将使用上一节中安装的 solc 库编译代码。 如果你还记得,我们之前提到过 web3js 是一个允许你通过 RPC 与区块链交互的库。 我们将使用这个库在节点控制台中部署合约并与区块链交互。

首先在终端运行node进入节点控制台,初始化web3对象,查询区块链获取所有账户。

确保 ganache 已经同时在另一个窗口中运行

要编译合约,首先从 Voting.sol 加载代码并将其绑定到字符串类型的变量,然后按如下方式编译合约。

$ node
In the node console
> Web3 = require('web3')
> web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
> web3.eth.accounts
['0x5c252a0c0475f9711b56ab160a1999729eccce97'
'0x353d310bed379b2d1df3b727645e200997016ba3'
'0xa3ddc09b5e49d654a43e161cae3f865261cabd23'
'0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5'
'0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798'
'0xda695959ff85f0581ca924e549567390a0034058'
'0xd4ee63452555a87048dcfe2a039208d113323790'
'0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14'
'0xba7ec95286334e8634e89760fab8d2ec1226bf42'
'0x208e02303fe29be3698732e92ca32b88d80a2d36']
> code = fs.readFileSync('Voting.sol').toString()
> solc = require('solc')
> compiledCode = solc.compile(code)

当你成功编译合约​​并打印compiledCode对象后(直接在节点控制台输入compiledCode就可以看到内容),你会注意到有两个重要的字段,非常重要,一定要了解:

教程请参考汇智网DAPP开发入门教程。 如果等不及博客更新,也可以直接访问这篇以太坊教程。