以太坊开发示例

简介: 关于智能合约和Solidity本文将不再介绍,可参考别的资料了解,本文重点介绍基于以太坊的Dapps开发测试及部署过程中涉及现流行的框架使用。一、重要的工具介绍1.Truffle:是以太坊的开发环境、测试框架和资产通道。

关于智能合约和Solidity本文将不再介绍,可参考别的资料了解,本文重点介绍基于以太坊的Dapps开发测试及部署过程中涉及现流行的框架使用。
一、重要的工具介绍
1.Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关 Truffle 套件的文档,了解更多信息。
2.Ganache:以前叫作 TestRPC,如果你读过几个月前的教程的话,有可能他们在使用 TestRPC 的情境下配合使用了 Truffle,它在 TestRPC 和 Truffle 的集成后被重新命名为 Ganache。Ganache 的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
3.Mist:Mist 是一个分布式网络 apps 的浏览器,相当于是只针对 Dapps 的 Chrome 或 Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的 dapp 中使用它。
4.以太坊钱包:它是 Mist 的一个版本,但只启动一个 dapp ——以太坊钱包。Mist 和以太坊钱包只是 UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
5Geth:Geth 是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
二、安装(基于windows7,其他os只做参考)
1.首先需要安装node.js,本文不再介绍;
2.Truffle安装:npm install -g truffle,如果出错,请参考Truffle的文档
3.Ganache安装:npm install -g ganache-cli
如果你对此不是很确定,点击此处访问 Ganache 的 Github 页面
注意:这是 Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
三、开发方式一(基于Truffle和Ganache)
首先,创建一个新的文件夹,在文件夹目录cmd,并输入。

truffle init

命令行输出如下:

image


这时候会初始化一个项目目录。

image


然后将写好的Wrestling.sol(编写好的智能合约, 下载地址)文件粘贴到contracts文件夹中。接下来,打开 “migrations” 文件夹并创建一个名为 “2_deploy_contracts.js” 的新文件。Migrations 只是帮助我们将合约部署到区块链的脚本。
将下面的代码粘贴到里面,然后保存。
const Wrestling = artifacts.require("./Wrestling.sol")

module.exports = function(deployer) {
    deployer.deploy(Wrestling);
};

第1行是用来导入 “Wrestling.sol” 文件的(从 “contracts” 文件夹导出),第4行则将它部署到区块链中。

现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除 “truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在 Windows 上有一个命名问题,当我们想要执行 Truffle 命令时,它会打开 “truffle.js” 配置文件而不是读取里面的数据。

我是在 Windows上写的这篇教程,所以我把 “truffle.js” 文件删掉了。然后我会把这段代码放入 truff-config.js 中:

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // for more about customizing your Truffle configuration!
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    }
  }
};

基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。

现在我们准备在区块链上测试代码啦!
四、方式一测试
在这里,会使用Ganache.
启动一个新的命令行,并输入以下命令:

ganache-cli -p 7545

它所做的,就是告诉ganache-cli从端口7545启动。

Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:

image


现在,回到我们的第一个命令行界面,执行两个命令:
truffle compile
truffle migrate --network development

Compile 将把我们的 Solidity 代码编译成字节码(以太坊虚拟机 (EVM) 能理解的代码),在我们的例子中,Ganache 模拟了 EVM。

Migrate(迁移) 会把代码部署到区块链,我们之前在 “truffle-config.js” 文件中设置了 “development” 网络,我们可以在那里找到区块链。

现在,如果一切都按照预期进行,你应该会在终端上看到:

image

注意,这里显示了实例化的 Wrestling 合约的地址。

在 ganache-cli 运行的命令行界面上,你可以看到正在执行的交易:

image


注意,它显示了实例化的 Wrestling 合约的地址。

现在输入以下命令启动 Truffle 控制台,这会帮助我们与ganache的区块链进行交互。

truffle console --network development

首先,我们会执行这个命令:

account0 = web3.eth.accounts[0]
account1 = web3.eth.accounts[1]

它会把第一个帐户的地址分配给变量 account0,第二个帐户分配给变量 account1。Web3 是一个 JavaScript API,它将 RPC 调用包装起来以方便我们与区块链进行交互。

然后我们输入:

Wrestling.deployed().then(inst => { WrestlingInstance = inst })

它为 truffle 部署到变量 “WrestlingInstance” 的合约实例分配了一个引用。

执行下一行:

WrestlingInstance.wrestler1.call()

它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在 migration(迁移)过程中,Truffle 会从 Ganache 选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是 Truffle 配置文件中的另一个地址,所以这是第一个账户。
然后我们把第二个账户注册为一个对手:

WrestlingInstance.registerAsAnOpponent({from: account1})

在这里,“from” 指令会告诉函数应该从哪一个账户触发交易。

在执行这一行之后,它应该会返回类似的内容:

image


注意,该项交易使用了Gas,并且触发了 “WrestlingStartsEvent” 事件。

你可以通过执行下列代码来检索第二位参与者的地址:

WrestlingInstance.wrestler2.call()

现在,玩家们可以开始角力了:

WrestlingInstance.wrestle({from: account0, value: web3.toWei(2, "ether")})
WrestlingInstance.wrestle({from: account1, value: web3.toWei(3, "ether")})
// End of the first round
WrestlingInstance.wrestle({from: account0, value: web3.toWei(5, "ether")})
WrestlingInstance.wrestle({from: account1, value: web3.toWei(20, "ether")})
// End of the wrestling

“value” 指令用来在交易时发送以太币。“web3.toWei(5, “ether”)” 意味着发送5个以太币,这个值会被转换成 Wei。Wei 是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。

在执行最后一行时,account1 会是大赢家,因为我们总共投入了 23 个以太币,比我们在 account0 投入的两倍还要多。

给你留个小练习:从合约中提取以太币。

现在,靠你自己研究如何使用 Truffle 和 Ganache 的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解, 这里有一篇很好的 Truffle 介绍
五、开发方式二(geth+mist或以太坊钱包)
好了,我们已经使用了 Ganache 来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
安装:
首先,下载geth。在 Windows 上,你可能需要将 geth 的安装文件夹添加到你的 PATH变量中。
下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。(本文下载的是Mist)
两个都是下载后直接解压就ok,需要将解压后文件添加到PATH中。
创建本地私有测试网络
在项目的根目录中,创建一个新文件,并将其命名为 “genesis.json”。然后把下面的内容复制进去。

{
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x8000000",
  "alloc": {},
  "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    }
}

注:json参数说明:

image


目录如下:

image

“genesis.json” 是一个配置文件,geth 需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。

如果你在没有指定任何参数的情况下运行 Geth,它会尝试连接到 Mainnet。Mainnet 是以太坊的主网络,是真正的以太坊区块链。

如果你在没有指定任何参数的情况下运行 Mist,那么如果 geth 实例也正在运行,它就会报错。但如果你让 Mist 连接到正在运行的 geth 实例(我们将在稍后操作),它就会正常工作。如果你在没有 geth 实例运行的时候运行 Mist,它将会启动一个新的 geth 实例,并最后向你询问它应该从哪一个区块链中下载区块。

虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。

启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):

geth --datadir=./chaindata/ init ./genesis.json

启动 geth 并指定区块链的存储位置,这里是在 chaindata 文件夹中(它会自动生成),然后我们用 “genesis.json” 配置文件对它进行初始化。
接下来,我们使用以下命令启动 geth:

geth --datadir=./chaindata/ --rpc

用 “--rpc” 参数让 geth 接受 RPC 连接,这是很有必要的,这样 truffle 才可以连接到geth。
打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:

mist –rpc http://127.0.0.1:8545

“-rpc” 参数让 Mist(或以太坊钱包)连接到我们刚刚启动的 geth 实例。

在“钱包”选项卡中,按下Add Account(添加帐户),创建一个新的钱包:

image


请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。

image


我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
打开一个新的命令行界面并运行以下命令:
geth attach

注意:windows上可能回出现如下错误:

image

使用这个命令:

geth attach  ipc:\\.\pipe\geth.ipc

运行后:

image


它会运行geth的控制台,现在我们可以与它进行交互。

无须通过在Mist UI上创建的主帐户,我们将在“geth attach”控制台中运行这个命令:

miner.start()

输出如下:

image


它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。

image


请注意,如果你没有足够的可使用的 RAM,它可能根本不会开始采矿。你可以使用 “miner.stop()” 指令停止挖矿。
image
现在,再次打开 “truffle-config.js” 文件,像这样修改它:
module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // for more about customizing your Truffle configuration!
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    ourTestNet: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" 
    }
  }
};

“ourTestNet” 是连接到geth实例所必需的配置。Geth 在端口8545上默认启动。

在我们启动 “geth attach” 的命令行界面中,我们会解锁账户。所以有了它,我们就可以从 Truffle 迁移智能合约。使用以下指令:

personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869', '123456789')

输出如下:

image


在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码 “123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。

现在,在项目根目录,运行以下命令:

truffle migrate --network ourTestNet

它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:

image


现在,运行以下命令启动 Truffle 控制台:
truffle console --network ourTestNet

然后运行这两个命令:

Wrestling.address
JSON.stringify(Wrestling.abi)

你会看到这样的输出:

image


第一行返回已部署的 Wresting 合约实例的地址。

第二行返回 Wresting 合约 ABI。ABI 基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。

现在,回到 Mist,我们打开合约中的选项卡,查看合约。

image


然后,复制之前部署的 Wrestling 合约的地址和 ABI:
windows命令行具坑,不能复制,你自己看着办吧!

image

点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:

image


使用 “select a function” 部分与合约进行交互。这和我们前面使用 Truffle 控制台是一样的。

就是这样,我们了解了 Ganache 和 geth 是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将 geth 与 mainnet 连接起来。

注意:你可以直接在 Mist 上部署一个合约而不使用 Truffle 迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用 Truffle 其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。

还有:你可以在一个基础的 nodepad 应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到 mainnet 上,但是我不建议你这样做。

本文在参考原创文章中做了自己实践中的一些问题,以及命令行输出样子,给新手更加直观的理解。

致敬原创:http://ethfans.org/posts/ethereum-development-walkthrough-part-2-truffle-ganache-geth-and-mist

目录
相关文章
|
5月前
|
区块链
关于代币合约项目系统开发DAPP模式方案【源码示例】
以下是一个简单的以太坊代币合约代码示例,它定义了一个名为 `Token` 的代币合约。在实际使用中,请确保您已获得适当的许可并遵循相关法规。
|
安全 区块链
DAPP智能合约链游系统开发源码部署示例
  //SPDX-License-Identifier:MIT   pragma solidity^0.8.0;   contract Game{   //游戏合约的名称   string public name;   //游戏玩家的地址   mapping(address=&gt;bool)public players;   //玩家的分数
|
安全 区块链 数据安全/隐私保护
基于以太坊的智能合约Fomo3D游戏开发规则部署
基于以太坊的智能合约Fomo3D游戏开发规则部署
|
存储 区块链 Python
以太坊中如何获取另外一个智能合约部署的合约地址?
如何获取另外一个智能合约部署的合约地址? 我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。
2344 0
|
存储 机器学习/深度学习 人工智能
智能合约简介
智能合约远胜于传统交易流程,因为它们有可能实现自动化,在某些情况下,甚至可以完全取代整个行业。同时,智能合约使交易更加公平、透明和安全。但是,除了实现自动化和改进单一的交易过程之外,智能合约还能发挥更大的作用。
467 0
智能合约简介
|
区块链 C++
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图(一)
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图(一)
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图(二)
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图(二)
|
Rust JavaScript 前端开发
区块链开发(八)以太坊不同语言客户端地址
区块链开发(八)以太坊不同语言客户端地址
134 0
|
区块链 算法 开发者
带你读《深入理解以太坊》之一:以太坊概述
这是一本从原理和实践两个层面系统、深入讲解以太坊技术的专著,从设计理念、技术架构、共识算法、智能合约、以太坊虚拟机、开发工具、DApp开发、企业以太坊解决方案、跨链技术等近10个方面进行了详细讲解,既适合初学者系统学习以太坊的原理和应用开发,又适合有一定基础的开发者深入掌握以太坊的底层运行机制。
|
存储 算法 区块链
以太坊原理简介
本文介绍以太坊的一些基础概念,以及基本原理。主要内容包括:以太坊是什么、以太坊网络、账户类型、账户状态、交易、费用、gas、叔块、以太坊区块链结构、以太坊结构
3993 0