目录
1. Ganache本地区块链
1.1 主界面
1.2 设置
2. 开发智能合约
2.1 初始化项目
2.2 添加package.json文件
2.3 添加智能合约源文件
2.4 编译项目
3. 部署智能合约到Ganache
3.1 更新配置文件
3.2 创建迁移脚本
3.3 执行迁移命令
1. Ganache本地区块链
首先启动Ganache,创建本地的以太坊区块链网络。
1.1 主界面
本地区块链可以模拟公共区块链,开发人员可以在本地区块链上测试智能合约。打开Ganache,界面如下图所示:
本地区块链缺省有10个外部账号,每个账号都有100个假的以太币,这些可以通过设置改变。
Ganache界面中有下面几个主要页面:
- ACCOUNTS – 账号页面,这显示了自动生成的所有帐户及其余额。
- BLOCKS – 区块页面,显示了在本地区块链网络上挖掘的每个区块,及其Gas成本和包含的交易。
- TRANSACTIONS – 交易页面,列出了在本地区块链上发生的所有交易。
- CONTRACS – 合约页面
- EVENTS – 事件页面
- LOGS – 日志页面
界面顶部的搜索栏,可以让你搜索本地区块链网络上的区块或交易。
1.2 设置
可以通过设置来定制Ganache的一些功能,单击主界面右上角的设置图标进入设置页面。
以下是一些主要设置:
- SERVER – 服务器设置页面,管理关于网络连接的详细信息,比如网络id、端口、主机名和自动挖掘状态。
- ACCOUNTS & KEYS – 帐户和密钥页,设置自动生成的帐户数量及其余额,缺省10个账号,每个账号余额是100 ether。
- CHAIN – 链页,让你为网络设置Gas限制和Gas价格。
- 高级设置 – 日志选项设置,比如保存日志文件和配置详细输出的能力。
请注意,在更改了新的设置之后,必须Restart
(设置页面右上角)才能生效。
2. 开发智能合约
我们将使用truffle创建一个智能合约项目,该智能合约的功能是可以获取值和设置值
2.1 初始化项目
首先创建项目目录:
$ mkdir mydapp
$ cd mydapp
然后使用truffle init
初始化项目,将生成项目模板文件:
$ truffle init
我们可以查看一下生成的项目目录:
G:\qikegu\ethereum\mydapp>tree /f
卷 数据 的文件夹 PATH 列表
卷序列号为 0C52-9CF4
G:.
│ truffle-config.js
│
├─contracts
│ Migrations.sol
│
├─migrations
│ 1_initial_migration.js
│
└─test
-
contracts 目录 智能合约源文件目录,现在已经有了一个
Migrations.sol
源文件,功能是迁移/部署/升级智能合约。 - migrations 目录 迁移文件目录,迁移文件都是javascript脚本,帮助我们把智能合约部署到以太坊。
- test 目录 测试代码目录。
- truffle-config.js 文件 Truffle项目配置文件,例如可以在里面配置网络。
2.2 添加package.json文件
package.json
是npm用来管理包的配置文件,在项目根目录下创建此文件,内容如下:
{
"name": "ethereum-demo",
"version": "1.0.0",
"description": "以太坊demo",
"main": "truffle-config.js",
"directories": {
"test": "test"
},
"scripts": {
"dev": "lite-server",
"test": "echo \"Error: no test specified\" && sexit 1"
},
"author": "kevinhwu@qikegu.com",
"license": "ISC",
"devDependencies": {
"@truffle/contract": "^4.0.33",
"dotenv": "^8.1.0",
"lite-server": "^2.5.4",
"truffle-hdwallet-provider": "^1.0.17"
}
}
关于依赖的包,用到时逐个安装。
2.3 添加智能合约源文件
在contracts 目录中创建一个新文件MyContract.sol
,内容如下所示:
// 声明solidity版本
pragma solidity ^0.5.0;
// 声明智能合约MyContract,合约的所有代码都包含在花括号中。
contract MyContract {
// 声明一个名为value的状态变量
string value;
// 合约构造函数,每当将合约部署到网络时都会调用它。
// 此函数具有public函数修饰符,以确保它对公共接口可用。
// 在这个函数中,我们将公共变量value的值设置为“myValue”。
constructor() public {
value = "myValue";
}
// 本函数读取值状态变量的值。可见性设置为public,以便外部帐户可以访问它。
// 它还包含view修饰符并指定一个字符串返回值。
function get() public view returns(string memory ) {
return value;
}
// 本函数设置值状态变量的值。可见性设置为public,以便外部帐户可以访问它。
function set(string memory _value) public {
value = _value;
}
}
这个智能合约的功能是可以获取值和设置值。
2.4 编译项目
现在让我们编译项目:
项目目录下执行命令:
$ truffle compile
等编译完成,可以看到多了一个build
目录,该目录下生成了新文件:./build/contract/MyContract.json
这个文件是智能合约ABI文件,代表“抽象二进制接口”。这个文件有很多作用,其中2个重要作用:
- 作为可在Ethereum虚拟机(EVM)上运行的可执行文件
- 包含智能合约函数的JSON表示,以便外部客户端可以调用这些函数
3. 部署智能合约到Ganache
接下来,我们将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:
- 更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。
- 创建迁移脚本,告诉Truffle如何部署智能合约。
- 运行新创建的迁移脚本,部署智能合约。
3.1 更新配置文件
更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。
打开位于项目根目录下的truffle-config.js
文件,修改内容如下:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // Match any network id
}
},
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
}
这些网络配置,包括ip地址、端口等,应该与Ganache的网络配置匹配:
3.2 创建迁移脚本
接下来,我们将在migrations
目录中创建迁移脚本,告诉Truffle如何部署智能合约,在该目录中创建文件2_deploy_contracts.js
。
注意,在migrations目录中所有文件都有编号,作用是让Truffle知道执行它们的顺序。
2_deploy_contracts.js
文件内容如下:
var MyContract = artifacts.require("./MyContract.sol");
module.exports = function(deployer) {
deployer.deploy(MyContract);
};
上面的代码中:
- 首先,
require
了创建的合约,并将其分配给一个名为“MyContract”的变量。 - 接着,将合约加入部署清单,运行迁移命令时合约将被部署。
3.3 执行迁移命令
现在让我们从命令行执行迁移命令, 部署智能合约。
$ truffle migrate
执行详情如下:文章来源:https://www.toymoban.com/news/detail-569067.html
G:\qikegu\ethereum\mydapp>truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 5777
> Block gas limit: 0x6691b7
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0xe62fb8a27c9ccc894562fbd7a7797526ad9323ab67a44516ae342642bf4ffcc6
> Blocks: 0 Seconds: 0
> contract address: 0x168A7247B58786edd259502948f5Bf9449C863AD
> block number: 1
> block timestamp: 1568189958
> account: 0x29920e756f41F8e691aE0b12D417C19204371E91
> balance: 99.99477214
> gas used: 261393
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00522786 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00522786 ETH
2_deploy_contracts.js
=====================
Deploying 'MyContract'
----------------------
> transaction hash: 0xe9dcef6f70332e476684e8f93ab96969af53920555161054f1f4bcc6277116fb
> Blocks: 0 Seconds: 0
> contract address: 0x4D3CFaF8457CEA76c0409f989f9870115B4d2d82
> block number: 3
> block timestamp: 1568189959
> account: 0x29920e756f41F8e691aE0b12D417C19204371E91
> balance: 99.98804272
> gas used: 294448
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00588896 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00588896 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.01111682 ETH
receipt:
{ transactionHash:
'0x83be6ef86fe542b3c94ae1dd5f2e04570c199d6b2e7997af60f3d91cda9259ec',
transactionIndex: 0,
blockHash:
'0x6e58c2c77b5998004b8a8c66760ca923814865307c69f1c779673cc2cbca06bc',
blockNumber: 5,
from: '0x29920e756f41f8e691ae0b12d417c19204371e91',
to: '0x4d3cfaf8457cea76c0409f989f9870115b4d2d82',
gasUsed: 33501,
cumulativeGasUsed: 33501,
contractAddress: null,
logs: [],
status: true,
logsBloom:
'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
v: '0x1c',
r:
'0xdaf1578a7987ec5d4e7d25c4b66f570d97f880b783d3403b54fa7eb30b1ab836',
s:
'0x4024f2b26bab6277cc86da9727a9bccc1ba7832773b9c2781b265f8dd87df46f',
rawLogs: [] },
logs: [] }
可以看到,我们已经将智能合约成功部署到本地的Ganache区块链网络。文章来源地址https://www.toymoban.com/news/detail-569067.html
到了这里,关于以太坊 – 部署智能合约到Ganache的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!