tokenpocketapp正版|truffle
快速入门 Truffle | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
快速入门 Truffle | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
深入浅出区块链
Truffle 中文文档
v5.0.0
快速入门 Truffle
创建项目工程
项目结构
使用测试
编译合约
使用 Truffle Develop 部署合约
可选: 通过 Ganache 部署
合约交互
进一步学习
基本功能
安装 Truffle
环境依赖
Windows 用户需了解
创建 Truffle 项目工程
编译合约
合约文件目录
编译命令
构建工件 Artifacts
引入合约依赖文件
通过文件名导入依赖文件
从外部包导入合约
合约部署(Migrations)
部署命令
脚本文件
artifacts.require()
module.exports
初始化迁移功能
部署程序 Deployer
考虑网络
可用账号
部署程序接口 Deployer API
deployer.deploy(contract, args…, options)
deployer.link(library, destinations)
deployer.then(function() {…})
与合约进行交互
介绍
数据的读和写
交易 Transactions
调用 Calls
什么是合约抽象
执行合约函数
执行交易Transactions
执行调用 call
处理交易结果
捕获事件 events
部署新合约
指定合约地址
给合约发送以太
延伸阅读
Truffle 和 MetaMask 配合
MetaMask 是什么?
安装 MetaMask
MetaMask 和 Ganache 搭配使用
探测 MetaMask 注入的 web3
MetaMask 设置
搭配 Truffle Develop 使用 MetaMask
搭配 Ganache CLI 使用 MetaMask
用 EthPM 进行包管理
安装软件包
安装依赖
使用安装的合约
发布自己的软件包
Ropsten, Ropsten, Ropsten
包配置
命令
在发布之前
用 NPM 进行包管理
包文件布局
使用包
安装
在合约代码中使用包
在JavaScript中使用包
包的部署地址
发布之前
调试合约
概述
调试命令
调试器界面
(o) 跳过(step over)
(i) 进入(step into)
(u) 跳出(step out)
(n) 下一步(step next)
(;) 单步指令(step instruction)
(p) 打印指令(print instruction)
(h) print this help
(q) 退出
(r) 重置(reset)
(b) 设置断点(set a breakpoint)
(B) 移除断点(大写的B)
(c) 跳到下一个断点
(+) 添加一个监视表达式
(-) 移除监视表达式
(?) 列出所有的监视表达式及断点
(v) 显示变量
(T) 卸载交易
(t) 加载交易
添加和移除断点
使用控制台
为什么有两个控制台?
命令
登录控制台
登录Develop控制台
配置 Truffle Develop
功能
可用命令
编写外部脚本
命令
文件结构
第三方插件命令
Plugin installation / usage
Creating a custom command plugin
支持 Quorum 开发
已知问题
配置
Using Privacy Features
编写测试用例
测试合约
测试框架
测试用例目录
测试合约命令
”干净的“ 测试环境
速度和可靠性考虑
用 JavaScript 写测试用例
Use contract() instead of describe()
Use contract abstractions within your tests
Using artifacts.require()
Using web3
Examples
Using .then
Using async/await
Specifying tests
Advanced
TypeScript File Support
用 Solidity 写测试用例
Example
Test structure
Assertions
Deployed addresses
Test contract names
Test function names
before / after hooks
Advanced features
Testing for exceptions
Testing ether transactions
高级用法
选择网络及部署
配置
指定网络
Build artifacts
应用部署
构建过程
运行外部命令
Providing a custom function
Creating a custom module
Bootstrapping your application
创建 Truffle Box
创建 box
配置文件
ignore (array)
commands (object)
hooks (object)
图片
Truffle site listing
参考引用
选择以太坊客户端
开发过程中
Ganache
Truffle Develop
Ganache CLI
部署到线上网络
部署到私有网络
Truffle 配置
配置文件位置
解决 Windows 命令名冲突
常用配置选项
网络 networks
提供者 Providers
指定合约目录
指定合约构建生成目录
迁移文件目录
mocha
指定编译器
solc
使用外部编译器
插件 plugins
EthPM 配置
包名:package_name
版本:version
描述:description
作者 authors
关键字 keywords
依赖 dependencies
许可协议 license
合约抽象封装
使用方法
API
Contract Abstraction API
MyContract.new([arg1, arg2, ...], [tx params])
MyContract.at(address)
MyContract.deployed()
MyContract.link(instance)
MyContract.link(name, address)
MyContract.link(object)
MyContract.networks()
MyContract.setProvider(provider)
MyContract.setNetwork(network_id)
MyContract.hasNetwork(network_id)
MyContract.defaults([new_defaults])
MyContract.clone(network_id)
MyContract.numberFormat = number_type
MyContract.timeout(block_timeout)
MyContract.autoGas =
MyContract.gasMultiplier(gas_multiplier)
Contract Instance API
Making a transaction via a contract function
Explicitly making a call instead of a transaction
Calling getters
Processing transaction results
Sending Ether / Triggering the fallback function
Estimating gas usage
Truffle 命令手册
使用方法
命令列表
构建 build
编译合约 compile
config
启动控制台 console
创建 create
调试 debug
部署 deploy
控制台 develop
exec
帮助 help
初始化工程 init
安装 install
migrate
网络 networks
操作码 opcode
发布 publish
运行 run
测试 test
解包 unbox
查看版本 version
监视变化 watch
联系开发者
Gitter
Issue Tracker
相关文档
Solidity 中文文档
Web3.js 中文文档
Truffle 中文文档
Docs »
快速入门 Truffle
Edit on GitHub
快速入门 Truffle¶
本文主要入门介绍如何创建 Truffle 项目以及将智能合约部署到区块链。
注解
在开始之前,最好对以太坊有基础的了解,推荐阅读 以太坊是什么 - 以太坊开发入门指南
或阅读 以太坊概述(英文) 。
创建项目工程¶
Truffle 大多数命令都是在 Truffle 项目目录下运行的。 所以第一步是创建一个 Truffle 项目。 可以创建一个空项目模板,不过对于刚接触Truffle的同学,推荐使用Truffle Boxes,它提供了示例应用代码和项目模板。 我们将使用MetaCoin box作为案例,它创建一个可以在帐户之间转移的Token(代币)。
为 Truffle 项目创建新目录:
mkdir MetaCoin
cd MetaCoin
下载 (“unbox”) MetaCoin box:
truffle unbox metacoin
注解
也可以使用 truffle unbox
注解
如果要创建没有合约的空工程,可以使用 truffle init.
在操作完成之后,就有这样的一个项目结构:
contracts/: Solidity合约目录
migrations/: 部署脚本文件目录
test/: 测试脚本目录,参考 如何测试应用?
truffle.js: Truffle 配置文件
项目结构¶
注解
这仅仅是一个入门。后面的文章我们可以学习到更多。
contracts/MetaCoin.sol: 这是一个用 Solidity 编写的 MetaCoin 代币 智能合约。注意他还引用了目录下的另外一个合约文件 contracts/ConvertLib.sol 。
contracts/Migrations.sol: 这是一个单独的 Solidity 文件,用来管理和升级智能合约. 每一个工程都有这样的一个文件,并且通常不需要编辑它。
migrations/1_initial_migration.js: 这是一个部署脚本,用来部署 Migrations 合约,对应 Migrations.sol 文件。
migrations/2_deploy_contracts.js: 这是一个部署脚本,用来部署 MetaCoin 合约. (部署脚本的运行是有顺序的,以2开头的脚本通常在以1开头的脚本之后运行)
test/TestMetacoin.sol: 这是一个用Solidity编写的测试用例文件,用来检查合约是否像预期一样工作。
test/metacoin.js : 这是一个用JavaScript编写的测试用例脚本,用途和上面一样。
truffle-config.js (之前是 truffle.js): Truffle 配置文件, 用来设置网络信息,和其他项目相关的设置。当我们使用内建的默认的Truffle命令时,这个文件留空也是可以的。
使用测试¶
打开控制台终端,运行 Solidity 测试用例:
truffle test ./test/TestMetacoin.sol
我们可以看到下面的输出:
TestMetacoin
√ testInitialBalanceUsingDeployedContract (71ms)
√ testInitialBalanceWithNewMetaCoin (59ms)
2 passing (794ms)
注解
如果在windows平台运行,这个命令遇到问题,可以参考这个文档 解决Windows命名冲突 。
运行测试用例的时候。期望的行为,会输出在控制台
运行 JavaScript 测试用例
truffle test ./test/metacoin.js
You will see the following output
Contract: MetaCoin
√ should put 10000 MetaCoin in the first account
√ should call a function that depends on a linked library (40ms)
√ should send coin correctly (129ms)
3 passing (255ms)
编译合约¶
编译智能合约:
truffle compile
我们可以看到下面的输出:
Compiling .\contracts\ConvertLib.sol...
Compiling .\contracts\MetaCoin.sol...
Compiling .\contracts\Migrations.sol...
Writing artifacts to .\build\contracts
使用 Truffle Develop 部署合约¶
注解
如果使用 Ganache , 可以直接跳到下一部分。
为了部署我们的合约,我们需要连接到区块链网络。Truffle 提供了一个内置的个人模拟区块链,它可以帮助我们用来测试。注意,这个区块链是内地在我们本地的系统里面,他不和以太坊的组网进行连接。
我们可以使用Truffle Develop来创建区块链,并与之交互。
运行 Truffle Develop:
truffle develop
我们可以看到下面的信息:
Truffle Develop started at http://127.0.0.1:9545/
Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
Private Keys:
(0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3
(1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f
(2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1
(3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c
(4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418
(5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63
(6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8
(7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7
(8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4
(9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5
Mnemonic: candy maple cake sugar pudding cream honey tiny smooth crumble sweet treat
⚠️ Important ⚠️ : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.
truffle(development)>
这也显示了10个账号,和他们对你的私钥,这些账号可以用来和区块链进行交互。
在 truffle(develop)> 提示符(因为提供了一个交互式控制台)下, Truffle 的命令可以不带前缀 truffle 执行。比如,可以直接输入compile 来执行truffle compile,以及直接输入 migrate 来部署编译的智能合约到区块链(相当于truffle migrate):
migrate
我们可以看到下面的信息:
Starting migrations...
======================
> Network name: 'develop'
> Network id: 4447
> Block gas limit: 6721975
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0x3fd222279dad48583a3320decd0a2d12e82e728ba9a0f19bdaaff98c72a030a2
> Blocks: 0 Seconds: 0
> contract address: 0xa0AdaB6E829C818d50c75F17CFCc2e15bfd55a63
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.99445076
> gas used: 277462
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00554924 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00554924 ETH
2_deploy_contracts.js
=====================
Deploying 'ConvertLib'
----------------------
> transaction hash: 0x97e8168f1c05fc40dd8ffc529b9a2bf45cc7c55b07b6b9a5a22173235ee247b6
> Blocks: 0 Seconds: 0
> contract address: 0xfb39FeaeF3ac3fd46e2123768e559BCe6bD638d6
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.9914458
> gas used: 108240
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.0021648 ETH
Linking
-------
* Contract: MetaCoin <--> Library: ConvertLib (at address: 0xfb39FeaeF3ac3fd46e2123768e559BCe6bD638d6)
Deploying 'MetaCoin'
--------------------
> transaction hash: 0xee4994097c10e7314cc83adf899d67f51f22e08b920e95b6d3f75c5eb498bde4
> Blocks: 0 Seconds: 0
> contract address: 0x6891Ac4E2EF3dA9bc88C96fEDbC9eA4d6D88F768
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.98449716
> gas used: 347432
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00694864 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00911344 ETH
Summary
=======
> Total deployments: 3
> Final cost: 0.01466268 ETH
这里显示了交易的ID号,部署的合约地址。以及交易的花费和一些相关的状态。
注解
当然我们自己部署的时候,交给哈希和一个地址和我们的账号,都是和上面不一样的。
可选: 通过 Ganache 部署¶
注解
直接了解如何与合约进行交互,可以直接跳到下一个部分。
除了用上面的 Truffle Develop,还可以选择使用 Ganache, 这是一个桌面应用,他同样会创建一个个人模拟的区块链。 对于刚接触以太坊的同学来说,Ganache 会更容易理解,因为他把所有的信息,都输在前端的界面。
不像 Truffle Develop 把链和控制台集成在一起,使用 Ganache 需要编辑配置文件,以便 Truffle 能链接 Ganache 实例。
下载安装 Ganache.
编辑器打开 truffle.js ,使用下面的内容:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*"
}
}
};
这是使用默认的连接参数去连接 Ganache(如果IP和端口有变化,需要同步修改上面的内容)。
保存关闭配置文件。
启动Ganache
Ganache 界面
打开控制台,执行部署:
truffle migrate
我们可以看到类似下面的输出:
Starting migrations...
======================
> Network name: 'develop'
> Network id: 4447
> Block gas limit: 6721975
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0x3fd222279dad48583a3320decd0a2d12e82e728ba9a0f19bdaaff98c72a030a2
> Blocks: 0 Seconds: 0
> contract address: 0xa0AdaB6E829C818d50c75F17CFCc2e15bfd55a63
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.99445076
> gas used: 277462
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00554924 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00554924 ETH
2_deploy_contracts.js
=====================
Deploying 'ConvertLib'
----------------------
> transaction hash: 0x97e8168f1c05fc40dd8ffc529b9a2bf45cc7c55b07b6b9a5a22173235ee247b6
> Blocks: 0 Seconds: 0
> contract address: 0xfb39FeaeF3ac3fd4TinY66668exionge6bD638d6
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.9914458
> gas used: 108240
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.0021648 ETH
Linking
-------
* Contract: MetaCoin <--> Library: ConvertLib (at address: 0xfb39FeaeF3ac3fd46e2123768e559BCe6bD638d6)
Deploying 'MetaCoin'
--------------------
> transaction hash: 0xee6574803810e7314cc83adf899d67f51f22e08b920e657480385c5eb498bde4
> Blocks: 0 Seconds: 0
> contract address: 0x6891ATinyEF3dA9bc88C96fXlbC9eA4d6D88F768
> account: 0x627306090abab3a6e1400e9345bc60c78a8bef57
> balance: 99.98449716
> gas used: 347432
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00694864 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00911344 ETH
Summary
=======
> Total deployments: 3
> Final cost: 0.01466268 ETH
这里同样显示了交易的ID号(hash),部署的合约地址。以及交易的花费和一些相关实时状态。
注解
当然我们自己部署的时候,交给哈希和一个地址和我们的账号,都是和上面不一样的。
在 Ganache 里,点击 “Transactions” 可以看到交易详情。
为了和合约进行交互,我们可以使用 Truffle 的控制台:truffle console, Truffle console 和 Truffle Develop 类似,仅仅是他们连接的链不一样而已,这里是连接 Ganache 。
truffle console
可以看到下面的提示:
truffle(development)>
注解
控制台提示符:truffle(development)> 括号里,指当前连接的网络。
合约交互¶
可以使用控制台 console 和合约进行交互:
注解
我们在例子中使用 web3.eth.getAccounts() , 它返回一个 promise 从中可以获取到由助记词生成的所有账号。 如果指定 (await web3.eth.getAccounts())[0] 会返回 0x627306090abab3a6e1400e9345bc60c78a8bef57.
在 Truffle v5, 控制台支持 async/await 方法(同步方式), 这样让跟合约交互更简单了,方法如下:
从获取部署合约实例 及获取账号列表 开始:
truffle(development)> let instance = await MetaCoin.deployed()
truffle(development)> let accounts = await web3.eth.getAccounts()
检查账号余额:
truffle(development)> let balance = await instance.getBalance(accounts[0])
truffle(development)> balance.toNumber()
查看以太价值(其实就是调用了一个合约方法:合约方法里定义了一个metacoin 价值 2 ether):
truffle(development)> let ether = await instance.getBalanceInEth(accounts[0])
truffle(development)> ether.toNumber()
发送一些 metacoin 到其他的账号 :
truffle(development)> instance.sendCoin(accounts[1], 500)
检查刚刚收款人的余额:
truffle(development)> let received = await instance.getBalance(accounts[1])
truffle(development)> received.toNumber()
检查刚刚发送方的余额:
truffle(development)> let newBalance = await instance.getBalance(accounts[0])
truffle(development)> newBalance.toNumber()
进一步学习¶
本篇快速入门仅仅是了解 Truffle 工程的一个生命周期,还有很多内容需要学习,请学习文档其余部分。
Next
Previous
© Copyright 2019, 深入浅出区块链
最后更新于 2019/05/21.
Built with Sphinx using a theme provided by Read the Docs.
以太坊开发框架——Truffle的基础使用_truffle框架-CSDN博客
>以太坊开发框架——Truffle的基础使用_truffle框架-CSDN博客
以太坊开发框架——Truffle的基础使用
最新推荐文章于 2024-03-06 14:09:26 发布
死磕的斯坦张
最新推荐文章于 2024-03-06 14:09:26 发布
阅读量1.9w
收藏
41
点赞数
8
分类专栏:
区块链
文章标签:
区块链
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/david2000999/article/details/120472092
版权
区块链
专栏收录该内容
10 篇文章
7 订阅
订阅专栏
这里写目录标题
TruffleTruffle 简介Truffle 的客户端安装Truffle创建项目Migrationartifacts.require()exports 的函数deployer 对象更新 migration 文件
更新 truffle 配置文件创建账户(可用 metamask 上账户转币)部署新建 JavaScript 文件 app/scripts/index.js
Truffle
Truffle 简介
truffle unbox webpack 一条命令由于要下载众多需要的模块,大概耗时 10 分钟左右,所以我们先来了解一下 Truffle。
Truffle 是目前最流行的以太坊 DApp 开发框架,(按照官网说法)是一个世 界级的开发环境和测试框架,也是所有使用了 EVM 的区块链的资产管理通道,它基于 JavaScript,致力于让以太坊上的开发变得简单。
Truffle 有以下功能:
内置的智能合约编译,链接,部署和二进制文件的管理。
合约自动测试,方便快速开发。
脚本化的、可扩展的部署与发布框架。
可部署到任意数量公网或私网的网络环境管理功能
使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
可配的构建流程,支持紧密集成。
在 Truffle 环境里支持执行外部的脚本。
Truffle 的客户端
我们之后写的智能合约必须要部署到链上进行测试,所以 truffle 构建的 DApp 也必须选择一条链来进行部署。我们可以选择部署到一些公共的测试链比如 Rinkeby 或者 Ropsten 上,缺点是部署和测试时间比较长,而且需要花费一定的时间赚取假代币防止 out of gas。当然,对于 DApp 发布的正规流程,staging(模拟环境)还是应该用测试公链的。
还有一种方式就是部署到私链上,这在开发阶段是通常的选择。Truffle 官方 推荐使用以下两种客户端: Ganache truffle develop
而 truffle develop 是 truffle 内置的客户端,跟命令行版本的 Ganache 基本 类似。在 truffle 目录下 bash 输入:
>truffle develop
即可开启客户端,和 ganache 一样,它也会给我们自动生成 10 个账户。 唯一要注意的是在 truffle develop 里执行 truffle 命令的时候需要省略前面的 “truffle”,比如“truffle compile”只需要敲“compile”就可以了
安装Truffle
启动 geth,然后我们来安装 truffle。truffle 是一个 dapp 的开发框架,它 可以使得 dapp 的构建和管理非常容易。
你可以像这样使用 npm 安装 truffle: >npm install -g truffle 然后我们创建一个空目录,在下面创建 truffle 项目:
>mkdir simple_voting_by_truffle_dapp
>cd simple_voting_by_truffle_dapp
>npm install -g webpack
>truffle unbox webpack
truffle init: 在当前目录初始化一个新的 truffle 空项目(项目文件只有 truffle-config.js 和 truffle.js;contracts 目录中只有 Migrations.sol;migrations目录中只有 1_initial_migration.js)
truffle unbox: 直接下载一个 truffle box,即一个预先构建好的 truffle 项目; unbox 的过程相对会长一点,完成之后应该看到这样的提示:
这里的 webpack 就是一个基于 webpack 构建流程的官方项目框架(truffle box),更多 truffle box 参见 https://truffleframework.com/boxes
创建项目
初始化一个 truffle 项目时,它会创建运行一个完整 dapp 所有必要的文件 和目录。我们直接下载 webpack 这个 truffle box,它里面的目录也是类似的:
>ls
README.md contracts node_modules test
webpack.config.js truffle.js app migrations
package.json
>ls app/
index.html javascripts stylesheets
>ls contracts/
ConvertLib.sol MetaCoin.sol Migrations.sol
>ls migrations/
1_initial_migration.js 2_deploy_contracts.js
app/ - 你的应用文件运行的默认目录。这里面包括推荐的 javascript 文 件和 css 样式文件目录,但你可以完全决定如何使用这些目录。 contract/ - Truffle 默认的合约文件存放目录。 migrations/ - 部署脚本文件的存放目录 test/ - 用来测试应用和合约的测试文件目录 truffle.js - Truffle 的配置文件 truffle 也会创建一个你可以快速上手的示例应用,你可以放心地删除项目下面 contracts 目录的 ConvertLib.sol和 MetaCoin.sol 文件。
>rm contracts/ConvertLib.sol contracts/MetaCoin.sol
此外,在你的项目目录下查找一个叫做 truffle.js 的配置文件。它里面包含 了一个用于开发网络的配置。将端口号从 7545 改为 8545,因为我们的私链及ganache 默认都会在该端口运行。
Migration
migration 的概念 理解 migrations(迁移)目录的内容非常重要。这些迁移文件用于将合约 部署到区块链上。
之前的项目中通过在 node 控制台中调VotingContract.new 将投票合约部署到区块链上。以后,我们再也不需要这么做了,truffle 将会部署和跟踪所有的部署。
Migrations(迁移)是 JavaScript 文件,这些文件负责暂存我们的部署任务,并且假定部署需求会随着时间推移而改变。随着项目的发展,我们应该创建新的迁移脚本,来改变链上的合约状态。所有运行过的 migration 历史记录,都会通过特殊的迁移合约记录在链上。
第一个迁移 1_initial_migration.js 向区块链部署了一个叫做 Migrations 的合约,并用于存储你已经部署的最新合约。每次你运行 migration 时,truffle 会向区块链查询获取最新已部署好的合约,然后部署尚未部署的任何合约。
然后它会更新 Migrations 合约中的 last_completed_migration 字段指向最新部署的合约。你可以简单地把它当成是一个数据库表,里面有一列 last_completed_migration ,该列总是保持最新状态。
migration 文件的命名有特殊要求:前缀是一个数字(必需),用来标记迁 移是否运行成功;后缀是一个描述词汇,只是单纯为了提高可读性,方便理解。
artifacts.require()
在脚本的开始,我们用 artifacts.require() 方法告诉 truffle 想要进行部署迁 移的合约,这跟 node 里的 require 很类似。不过需要注意,最新的官方文档告诫,应该传入定义的合约名称,而不要给文件名称——因为一个.sol 文件中可能包含了多个 contract。
exports 的函数
migration js 里的 exports 的函数,需要接收一个 deployer 对象作为第一个 参数。这个对象在部署发布的过程中,主要是用来提供清晰的语法支持,同时提供一些通用的合约部署职责,比如保存部署的文件以备稍后使用。
deployer 对象
deployer 对象是用来暂存(stage)部署任务的主要操作接口。 像所有其它在 Truffle 中的代码一样,Truffle 提供了我们自己代码的合约抽 象层(contract abstractions),并且进行了初始化,以方便你可以便利的与以太坊的网络交互。这些抽象接口都是部署流程的一部分。
更新 migration 文件
将 2_deploy_contracts.js 的内容更新为以下信息:
var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
deployer.deploy(Voting, ['Alice', 'Bob', 'Cary'], {gas:
290000});
};
从上面可以看出,部署者希望第一个参数为合约名,跟在构造函数参数后面。
在我们的例子中,只有一个参数,就是一个候选者数组。第三个参数是一个哈希,我们用来指定部署代码所需的 gas。gas 数量会随着你的合约大小而变化。对于投票合约, 290000 就足够了。
更新 truffle 配置文件
像下面这样更新 truffle.js 的内容:
require('babel-register')
module.exports = {
networks: {
development: {
host: 'localhost',
port: 8545,
network_id: '*',
gas: 470000
} } }
你会注意到,之前的 truffle.js 与我们更新的文件唯一区别在于 gas 选项。 这是一个会应用到所有 migration 的全局变量。比如,如果你没有指定 2_deploy_contracts.js gas 值为 290000,migration 就会采用默认值 470000.
合约代码Voting.sol 之前我们已经完成了编码工作,无须额外改动即可用于 truffle。将文件从 simple_voting_dapp 复制到 contracts 目录即可。
创建账户(可用 metamask 上账户转币)
在能够部署合约之前,我们需要一个里面有一些以太的账户。当我们用 ganache 的时候,它创建了 10 个测试账户,每个账户里面有 100 个测试以 太。但是对于测试网和主网,我们必须自己创建账户,并往里面打一些以太。
在之前的 ganache 应用里,我们曾单独启动了一个 node 控制台,并初始 化了 web3 对象。当我们执行 truffle 控制台时,truffle 会帮我们做好所有准备,我们会有一个立即可用的 web3 对象。现在我们有一个账户,地址为 ‘0x95a94979d86d9c32d1d2ab5ace2dcc8d1b446fa1’ (你会得到一个不同的地址),账户余额为 0。
>truffle console
// Replace 'verystrongpassword' with a good strong password.
truffle(development)>
web3.personal.newAccount('verystrongpassword') ' 0xbaeec91f6390a4eedad8729aea4bf47bf8769b15'
truffle(development)>
web3.eth.getBalance('0xbaeec91f6390a4eedad8729aea4bf47bf8769b1
5')
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)>
web3.personal.unlockAccount('0xbaeec91f6390a4eedad8729aea4bf47
bf8769b15', 'verystrongpassword', 15000)
部署
如果已经有了一些以太,我们就可以继续编译并把合约部署到区块链上。你 可以在下面找到相关命令,如果一切顺利,就会出现以下输出。
>truffle compile
Compiling Migrations.sol...Compiling Voting.sol...Writing
artifacts to ./build/contracts
>truffle migrate
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0x3cee101c94f8a06d549334372181bc5a7b3a8bee
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
Voting: 0xd24a32f0ee12f5e9d233a2ebab5a53d4d4986203
Saving successful migration to network...
Saving artifacts...
如果你有多个账户,确保相关账户未被锁定。默认情况,第一个账户 web3.eth.accounts[0] 会用于部署。
可能出现的问题和解决方案
如果由于 gas 不足而部署失败,尝试将 migrations/2_deploy_contracts.js 里面的 gas account 增加至 500000。比如:deployer.deploy(Voting, [‘Rama’, ‘Nick’, ‘Jose’], {gas: 500000});如果你有多个账户,并且更喜欢自选一个账户,而不是 accounts[0],你可以在 truffle.js 中指定想要使用的账户地址。在 network_id 后面添 加 ‘from: your address’,truffle 将会使用你指定的地址来部署和交互。
如果部署顺利,你可以通过控制台和网页与合约进行交互
新建 JavaScript 文件 app/scripts/index.js
// Import the page's CSS. Webpack will know what to do with it.
import "../styles/app.css";
// Import libraries we need.
import { default as Web3} from 'web3';
import { default as contract } from 'truffle-contract'
import voting_artifacts from '../../build/contracts/Voting.json'
var Voting = contract(voting_artifacts);
let candidates = {"Alice": "candidate-1", "Bob": "candidate-2",
"Cary": "candidate-3"}
window.voteForCandidate = function(candidate) {
let candidateName = $("#candidate").val();
try {
$("#msg").html("Vote has been submitted. The vote count
will increment as soon as the vote is recorded on the blockchain.
Please wait.")
$("#candidate").val("");
Voting.deployed().then(function(contractInstance) {
contractInstance.voteForCandidate(candidateName,
{gas: 140000,
from:web3.eth.accounts[0]})
.then(function() {
let div_id = candidates[candidateName];
return
contractInstance.totalVotesFor
.call(candidateName).then(function(v) {
$("#" + div_id).html(v.toString());
$("#msg").html("");
});
});
});
} catch (err) {
console.log(err);
}
}
$( document ).ready(function() {
if (typeof web3 !== 'undefined') {
console.warn("Using web3 detected from external
source like Metamask") // Use Mist/MetaMask's provider
window.web3 = new Web3(web3.currentProvider);
} else {
console.warn("No web3 detected. Falling back to
http://localhost:8545. You should remove this fallback when you
deploy live, as it's inherently insecure. Consider switching to
Metamask for development. More info here:
http://truffleframework.com/tutorials/truffle-and-metamask");
// fallback - use your fallback strategy (local node / hosted node
+ in-dapp id mgmt / fail)
window.web3 = new Web3(new
Web3.providers
.HttpProvider("http://localhost:8545"));
}
Voting.setProvider(web3.currentProvider);
let candidateNames = Object.keys(candidates);
for (var i = 0; i < candidateNames.length; i++) {
let name = candidateNames[i];
Voting.deployed().then(function(contractInstance) {
contractInstance.totalVotesFor
.call(name).then(function(v) {
$("#" + candidates[name])
.html(v.toString());
});
});
}
});
Line 7: 当你编译部署好投票合约时,truffle 会将 abi 和部署好的地址存储 到一个 build 目录下面的 json 文件。我们已经在之前讨论了 abi 。我们会用 这个信息来启动一个 Voting 抽象。我们将会随后用这个 abstraction 创建一个Voting 合约的实例。
Line 14: Voting.deployed() 返回一个合约实例。truffle 的每一个调用会返 回一个 promise,这就是为什么我们在每一个交易调用时都使用 then().
控制台交互需要重新打开一个新的 console
>truffle console
truffle(default)>
Voting.deployed().then(function(contractInstance)
{contractInstance.voteForCandidate('Alice').then(function(v)
{console.log(v)})})
{ blockHash:
'0x7229f668db0ac335cdd0c4c86e0394a35dd471a1095b8fafb52ebd76714
33156',
blockNumber: 469628,
contractAddress: null,
....
....
truffle(default)>
Voting.deployed().then(function(contractInstance)
{contractInstance.totalVotesFor.call('Alice').then(function(v)
{console.log(v)})})
{ [String: '1'] s: 1, e: 0, c: [ 1] }
在调用 voteForCandidate 方法之后需要稍等一下,因为发送交易需要时间; 注意,truffle 的所有调用都会返回一个 promise,这就是为什么会看到每个 响应被包装在 then() 函数下面;另外 totalVoteFor() 方法也可以不加.call() 直 接调用,不会发送交易。
发出的交易可以在 geth 的 log 输出文件中查到;如果我们连接的是测试网 络,可以在 etherscan 上 https://rinkeby.etherscan.io 查询。
可以看到 truffle 默认的 gasPrice 是 100GWei,如果心疼,可以在 truffle.js 中更改,加上 gasPrice: 1000000000 将其改为 1GWei,重启 truffle console 生效。
网页交互 在控制台用 webpack 启动服务器:
>npm run dev
默认端口 8080,在浏览器访问 localhost:8080 即可看到页面。 如果安装了 metamask,index.js 中会自动检测并使用 metamask 作为 web3 Provider;所以应该注意把 metamask 切换到我们当前连接的网络。
优惠劵
死磕的斯坦张
关注
关注
8
点赞
踩
41
收藏
觉得还不错?
一键收藏
知道了
0
评论
以太坊开发框架——Truffle的基础使用
这里写目录标题TruffleTruffle 简介Truffle 的客户端安装Truffle创建项目Migrationartifacts.require()exports 的函数deployer 对象更新 migration 文件更新 truffle 配置文件创建账户(可用 metamask 上账户转币)部署新建 JavaScript 文件 app/scripts/index.jsTruffleTruffle 简介truffle unbox webpack 一条命令由于要下载众多需要的模块,大概耗时 1
复制链接
扫一扫
专栏目录
以太坊区块链积分系统truffle项目源代码
09-06
以太坊区块链积分系统truffle项目源代码,本人注释过了,最重要的文件是Score.sol 和 app.js ,可以帮助学习以太坊dapp开发
【区块链-智能合约工程师】第四篇:Truffle框架安装和介绍(Windows)
soldi_er的博客
01-03
2784
Truffle 是目前最流行的以太坊 DApp 开发框架,(按照官网说法)是一个世界级的开发环境和测试框架,也是所有使用了 EVM 的区块链的资产管理通道,它基于 JavaScript,致力于让以太坊上的开发变得简单。内置的智能合约编译,链接,部署和二进制文件的管理。合约自动测试,方便快速开发。脚本化的、可扩展的部署与发布框架。可部署到任意数量公网或私网的网络环境管理功能使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
参与评论
您还未登录,请先
登录
后发表或查看评论
安装truffle的前提条件(nodejs和npm),truffle的webpack案例测试,webpack项目中的报错
qq_50330658的博客
09-07
8982
truffle安装
Ubuntu20.04下truffle相关组件版本如下:
Truffle v5.2.4 (core: 5.2.4)
Solidity v0.5.16 (solc-js)
Node v14.16.0
Web3.js v1.2.9
npm v7.6.3
1.curl 安装
sudo apt-get install curl
2.node和npm安装
(node 和npm的版本要相匹配不然后续truffle
Truffle搭建环境migrate步骤错误解决方案
dick的博客
12-25
4186
1.truffle migrate失败
报错信息为:
2_deploy_contracts.js
=====================
C:\Users\asus\AppData\Roaming\npm\node_modules\truffle\build\cli.bundled.js:260211
throw new Error("Could not find artifacts f...
truffle-demo:Truffle以太坊Dapp开发框架
05-10
Truffle以太坊Dapp开发框架
文章地址:
前言
区块链的开发对于大多数的人来说,都是一件很新、很难的事情,有太多不一样的技术要学习。区块链有自己的设计理念,不同于传统分布式系统架构,数据同步机制,共识算法等。以太坊作为区块链2.0的产品,最独特是智能合约的设计,是超脱于技术的思维体系。
通过 Truffle 把这些不同的理念和思路进行整合,转换为开发人员能明白的一种编程方法。
目录
Truffle安装
初始化项目
启动测试节点
部署合约
自定义的智能合约
交互的控制台
启动合约服务
下载和运行
git clone https://github.com/bsspirit/truffle-demo.git
cd truffle-demo
npm install -g truffle
npm install -g ethereumjs-testrpc
testrpc
truffle co
【web3实践 | 以太坊开发框架Truffle使用】
小新的博客
03-29
2419
Truffle是一个面向以太坊的开发框架,提供一整套构建、测试、部署以及管理智能合约的开发工具。Truffle可以与以太坊节点交互,使开发人员能够在本地开发、测试和部署智能合约。Truffle提供了一个基于命令行的、易于使用的开发环境,可以通过Truffle来编写智能合约,进行本地测试和调试,进行远程部署,以及与以太坊网络进行交互。Truffle还提供了自己的智能合约编译器和构建管道,可以方便地构建、优化和管理智能合约的构建过程,减少了手动干预的需要。
以太坊DAPP——truffle框架的使用
Limbo_Y的博客
12-14
691
这里写自定义目录标题以太坊DAPP——truffle框架的使用操作系统安装Node.js和npm安装Truffle安装Ganache-cli新建一个空文件夹功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公...
深入探索Truffle Suite:构建、测试和部署以太坊智能合约的完整开发框架
难办就别办的博客
05-02
632
Truffle Suite 是一个完整的以太坊开发框架,它提供了一整套工具和库,可帮助开发者更快地构建、测试和部署以太坊智能合约。无论您是初学者还是经验丰富的开发者,Truffle Suite 都是一个值得尝试的开发框架。本文将深入探讨 Truffle Suite 的各个组件,包括 Truffle、Ganache 和 Drizzle,以及如何使用它们来进行以太坊智能合约开发以及如何在以太坊智能合约开发中使用 Truffle Suite 的各个组件,包括 Truffle、Ganache 和 Drizzle。
Truffle Suite框架
m0_69117588的博客
05-09
154
Truffle Suite框架
Truffle最受欢迎的区块链开发框架
08-08
Truffle - 是以太坊的开发环境,测试框架和资产管道,旨在解放太坊开发人员。
以太坊truffle框架开发包
07-14
以太坊turffle框架初始化的demo实例,需要相关环境才能运行,可以参考我的博客,想学习dapp开发的同学可以看看
以太坊DApp开发的入门示例
01-27
ubuntu16.04,64位 还需要安装以太坊相关的环境: *nodejs *truffle *solidity*testrpc 另外,本篇还会用到webpack,安装教程网上也有很多。这部分如果不熟悉的话请自行查阅学习下。需
以太坊、私有链搭建、web3教程、Truffle开发入门.rar
10-26
快速学习从头开始学习以太坊,从私链搭建到以太坊基础知识以及solidity智能合约,再到web3.js开发,最后使用Truffle管理项目。
EthSign联合创始人 POTTER LI 确认出席Hack .Summit() 香港区块链开发者大会!
TechubNews的博客
03-04
1012
Hack .Summit() 是专注于区块链开发者的盛会,首届会议于 2014 年举办,截至 2023 年的上一届会议,Hack .Summit() 累计参与人数已超 13 万,总计邀请了超 1000 名具有全球影响力的 Web3 重磅嘉宾与会。thSign联合创始人 POTTER LI确认将出席由 Hack VC 主办,并由 AltLayer 和 Berachain 联合主办,与 SNZ 和数码港合作,由 Techub News 承办的Hack.Summit() 2024区块链开发者盛会。
【01】区块链科普100天-模块化区块链
总要有点可以骄傲的东西
02-29
641
这不仅减轻了主链的负担,也为开发者提供了更大的灵活性和创新空间。lgnis是基于Ardor公链的一个子链,母子链架构增强了网络性能,而且提供了更高的灵活性,这种架构不仅增强了网络的性能,而且提供了很高的灵活性,适合快速发展和部署DApp。1.层次架构:传统区块链将所有任务,如交易处理、共识机制、数据存储等集成在单一层中,模块化区块链将这些功能分割成独立的层,实现更高效的处理和升级。2.可拓展性:模块化区块链中,不同功能的隔离提高了整体网络的安全性,即使某一模块出现安全问题,也不会影响整个网络。
Ethersacn的交易数据是什么样的(2)
在这个数字革命的时代,我们将引领您穿越去中心化、智能合约、加密货币以及分布式应用程序的世界。无论您是初学者还是经验丰富的区块链开发者,我们都致力于为您提供有价值的信息和见解。
03-04
513
允许对复杂的数据结构进行编码。所以分析交易数据就是对。它被用于将各种数据结构转换为。,以便在以太坊中传输和存储。
如何做代币分析:以 USDC 币为例
最新发布
m0_60517769的博客
03-06
285
USDC 是最透明和值得信赖的稳定币之一,因为每个流通中的 USDC 代币都有相应数量的美元储备。
什么是区块链粉尘攻击?
J_Lee
03-02
970
什么是区块链粉尘攻击?
Kakarot:当今以太坊的未来
mutourend的博客
03-06
873
Kakarot:当今以太坊的未来
以太坊智能合约开发第六篇:truffle开发框架
05-24
Truffle是一个以太坊智能合约开发框架,它提供了一系列的工具和库,可以帮助开发者更加方便地编写、测试和部署智能合约。
Truffle的主要功能包括:
1. 合约编译器:Truffle提供了一个内置的Solidity编译器,可以将Solidity代码编译成以太坊虚拟机可以理解的字节码。
2. 合约部署:Truffle可以帮助开发者将编译后的合约部署到以太坊网络中,同时还提供了一些便捷的工具,比如自动部署。
3. 测试框架:Truffle提供了一个完整的测试框架,可以帮助开发者编写测试用例,保障合约的安全性和正确性。
4. 调试工具:Truffle提供了一个交互式调试工具,可以帮助开发者快速定位合约中的问题。
5. 包管理工具:Truffle提供了一个包管理工具,可以方便地管理合约中使用的依赖库。
总之,Truffle是一个非常强大的以太坊智能合约开发框架,可以帮助开发者更加高效地进行合约开发。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
死磕的斯坦张
CSDN认证博客专家
CSDN认证企业博客
码龄5年
暂无认证
469
原创
16万+
周排名
79万+
总排名
81万+
访问
等级
7008
积分
565
粉丝
522
获赞
115
评论
3348
收藏
私信
关注
热门文章
百度网盘秒传链接怎么用及实现原理
55435
Web3.js的基本使用(与以太坊智能合约的交互)
33837
测试用例设计——等价类划分法
26076
idea运行项目报错Cannot run program “C:\Program Files\Java\jdk1.8.0_121\bin\java.exe......解决办法
24726
以太坊开发框架——Truffle的基础使用
19924
分类专栏
Java学习
131篇
区块链
10篇
大前端
65篇
Python
25篇
机器学习
5篇
数学建模
11篇
尚医通项目
16篇
计算机系统和网络
34篇
软件测试和软件工程
20篇
信息安全
3篇
大数据技术栈
2篇
算法和数据结构
11篇
C和C++
111篇
数据库
25篇
学习之路
6篇
Linux,Docker和Git
23篇
最新评论
npm install过程中一直卡在sill install loadAllDepsIntoIdealTree
十四点三十七:
npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务,建议更改下,要不还是报错
Problem E: 指针:调用自定义函数input、output完成对n个元素的数组进行输入输出。
Dl367:
想问问input里面scanf为什么是a+i
Problem C: 零起点学算法83——数组中删数
2301_80436713:
为啥能运行但是不出数啊
测试用例设计——等价类划分法
45°台风:
老哥这篇文章由浅入深,从思维着手,很是不错,能告诉我原创是?
关于企业贷款违约情况的数据分析研究的Python数据分析案例
m0_64697021:
求数据
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
基于斗鱼的娱乐直播视频平台--Vue移动端页面
基于Pygame框架的交通导流可视化模拟
机器学习笔记05——集成学习
2022年24篇
2021年266篇
2020年117篇
2019年95篇
目录
目录
分类专栏
Java学习
131篇
区块链
10篇
大前端
65篇
Python
25篇
机器学习
5篇
数学建模
11篇
尚医通项目
16篇
计算机系统和网络
34篇
软件测试和软件工程
20篇
信息安全
3篇
大数据技术栈
2篇
算法和数据结构
11篇
C和C++
111篇
数据库
25篇
学习之路
6篇
Linux,Docker和Git
23篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
【区块链开发入门】(四) Truffle详解篇1_truffle区块-CSDN博客
>【区块链开发入门】(四) Truffle详解篇1_truffle区块-CSDN博客
【区块链开发入门】(四) Truffle详解篇1
最新推荐文章于 2023-07-25 10:13:16 发布
Famidlistimo
最新推荐文章于 2023-07-25 10:13:16 发布
阅读量1.8k
收藏
13
点赞数
4
分类专栏:
区块链
文章标签:
区块链
以太坊
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44029550/article/details/110530722
版权
区块链
专栏收录该内容
14 篇文章
10 订阅
订阅专栏
由于本篇篇幅较长,因此转为两篇文章。Truffle详解篇篇2请见:link 目录导航页 【区块链开发入门】(一) 以太坊的搭建与运行 【区块链开发入门】(二) 以太坊的编程接口 【区块链开发入门】(三) Solidity合约编译、部署 【区块链开发入门】(四) Truffle详解篇1 【区块链开发入门】(四) Truffle详解篇2
目录
一、什么是Truffle二、安装Truffle三、创建并初始化项目四、创建合约五、编译合约六、迁移合约1. arifacts.require()2. module.exports3. 初始化迁移合约4. 部署器(deployer)5. deployer API
一、什么是Truffle
Truffle是针对基于以太坊的Solidity语言的一套开发框架。本身基于Javascript。Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,旨在让以太坊上的开发变得简单,Truffle有以下:
内置的智能合约编译,链接,部署和二进制文件的管理。利用快速开发的自动合约测试。可脚本化的,可扩展的部署与发布框架。网络管理,用于部署到任意数量的公网或私网的网络环支持持续集成可配置构建管道。与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。可配的构建流程,支持紧密集成。在Truffle环境里支持执行外部的脚本。提供了合约抽象接口,可以直接通过var instance = Storage.deployde();拿到合约对象,然后在Javascript中直接操作对于的合约函数。原理是使用了基于web3.js封装的Ether Pudding工具包。提供了控制台,使用框架构建后,可以直接在命令行调用输出结果,可极大地方便开发和调试。
当开发基于Truffle的应用时,推荐使用EthereumJS TestRPC。它是一个完整的运行在内存中的区块链,仅存在于开发设备上。它在执行交易时是实时返回的,而不用等待默认的出块时间,这样可以快速验证新写的代码。当出现错误时,也能即时得到反馈。它同时还是一个支持自动化测试的功能powerful的客户端。最好使用TestRPC客户端进行充分测试后,再使用Geth,Parity,ruby-ethereum等以太坊全客户端。这些是完整的客户端实现,包括挖矿、网络、区块以及交易的处理,基于Truffle的应用可以在不需要额外配置的情况下发布到这些客户端。
二、安装Truffle
通过如下命令安装Truffle:
$ sudo npm install -g truffle
或者
//把npm的包源设置为淘宝的镜像,先安装cnpm
$ sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
$ sudo cnpm install -g truffle
我用的是第二个命令安装(第一个命令我的安装不了Truffle也不知什么情况)。但是还是遇到问题如下: 解决办法:就是更新node。
$ sudo npm install n -g //安装n这个工具,n这个工具是用于更新node版本的工具
$ sudo n stable //安装最新稳定版的nodejs
$ node -v //查看node的版本是否更新了
安装完Truffle之后,执行下面的命令确保其被正确安装了。
$ sudo truffle version
Truffle v5.1.55 (core: 5.1.55)
Solidity v0.5.16 (solc-js)
Node v14.15.1
Web3.js v1.2.9
三、创建并初始化项目
通过如下命令创建并初始化项目:
$ mkdir myproject
$ cd myproject
$ sudo truffle init
Starting init...
================
> Copying project files to /home/yulin/myproject
Init successful, sweet!
初始化完成后的目录结构如下:
contracts/:存放编写的合约。migrations/:存放迁移部署脚本。test/:存放合约测试脚本。truffle-config.js:Truffle的配置文件。
四、创建合约
进入contracts目录,创建Storage.sol合约文件。
$ cd contracts
$ touch Storage.sol
合约的内容如下:
pragma solidity ^0.7.5;
contract Storage {
uint256 public storedData;
function set(uint256 data) public {
storedData = data;
}
function get() public returns (uint256) {
return storedData;
}
}
五、编译合约
使用truffle compile命令编译Storage.sol合约。
遇到问题: 我的solidity版本是0.7.5。错误提醒我的truffle和solc编译器不匹配。 做法:是在truffle-config.js修改成以下内容即可!
$ truffle compile
Compiling your contracts...
===========================
> Compiling ./contracts/Migrations.sol
> Compiling ./contracts/Storage.sol
> Compilation warnings encountered:
/home/yulin/myproject/contracts/Storage.sol:7:5: Warning: Function state mutability can be restricted to view
function get() public returns (uint256) {
^ (Relevant source part starts here and spans across multiple lines).
> Artifacts written to /home/yulin/myproject/build/contracts
> Compiled successfully using:
- solc: 0.5.16+commit.9c3226ce.Emscripten.clang
可以看出,合约编译后的文件会写入/build/contracts目录中,这些合约编译后的文件对于truffle框架能否正常工作至关重要。不用手动修改这些文件,因为即使修改了,再次执行编译命令时又会被覆盖。
Truffle默认只编译自上次编译后被修改过的合约,目的是减少不必要的编译。如果想全部编译,可以使用–all选项。
$ truffle compile --all
合约编译完成后,需要部署Storage.sol合约,在truffle中部署合约需要用到迁移脚本。接着进入migrations目录中为Storage合约创建一个迁移脚本。
六、迁移合约
迁移脚本是由一些Javascript文件组成的,用来帮助把合约发布到以太坊网络中。之所以需要迁移脚本,是因为部署需求会随着时间改变。随着项目的发展,可以创建新的迁移脚本把这些变化的合约部署到区块链上,之前运行的迁移历史记录,会被一个特殊的Migrations.sol合约记录在区块链上。
迁移脚本的命名规则:文件名以数字开头,以一个描述性的后缀结尾。数字前缀是必需的,用于记录移植是否成功。后缀仅是为了提高可读性,以方便理解。
$ cd migrations
$ touch 2_storage_migration.js
文件为2_storage_migration.js:
var Storage = artifacts.require("Storage");
module.exports = function(deployer){
deployer.deploy(Storage);
};
1. arifacts.require()
在迁移脚本开始时,通过arifacts.require()告诉truffle将要和哪个合约交互。这个方法类似于欧NodeJs中的require,但在这里,它返回的是一个合约抽象。可以在迁移脚本的其余部分中使用这个合约抽象。arifacts.require()中使用的名字不是必须与合约源文件的文件名相同,相反,它应该与在合约源代码中定义的合约类的名称不同。
2. module.exports
在迁移脚本最后,通过module.exports导出一个函数,将迁移脚本导出的函数都应该接受一个deploy对象作为其第一个参数。deployer对象中的辅助函数在部署过程中有了清晰的语法,用于部署智能合约及执行一些常见的任务,比如把发布后的对象保存下来供以后使用。这个deployer对象部署任务的主接口。
至此准备工作已经做好,接下来就把Storage.sol部署到区块链上。这里将合约部署到TestRPC环境中。(因为我使用testrpc出现了问题,故我将合约部署到Ganache-cli环境中)。 启动Ganache-cli:
$ ganache-cli
Ganache CLI v6.12.1 (ganache-core: 2.13.1)
Available Accounts
==================
(0) 0x817b21276A314E454D8911b72F2e3eEDc7A4590b (100 ETH)
(1) 0xED2B6Ac7441D9514f979c4e026CEfEc5BD554c3c (100 ETH)
(2) 0x6262E43D56784D5488Ae2b50eD55d534dF306424 (100 ETH)
(3) 0xfBfb2280F9Db37ED10f0c6086299fAC806B89Bc3 (100 ETH)
(4) 0xCfF55d2682d9385614F4ADf4329825df4c2bB960 (100 ETH)
(5) 0x51A6cc07f8b7F2238B4CA17488Fa8B07fb4635C8 (100 ETH)
(6) 0xAccBDE3D4A1D6B9f8149eD264248943B098c98e6 (100 ETH)
(7) 0x3CC022c183B23cc5c7820F7a4892CEa58b056f2A (100 ETH)
(8) 0xEa5680CAf6F18e0B3Dd8b09AABaea368815b97Bf (100 ETH)
(9) 0x08753E3F5e58B5A108898CEa2cb6388a16b1B26a (100 ETH)
Private Keys
==================
(0) 0x32193d3d58fe2162180a4df59630d0ebbcfc9b8a15cca75051ab7487d7f7661d
(1) 0x5729a0dd9403b4253e24b0b8061bde8a649b3dda7e6e40c62f77278ad744626b
(2) 0xd65e049ca3fc405c7904478befcb70503324a8019ab32f82a75eb0b5d494bc1c
(3) 0xafd67abb1872ada2ad298bc1b99970a9ce21394dcab21a5a4007e8bd56f99607
(4) 0x5c0e84154d50a103908f8640647be38e38c1edd1dd0be001e7257242b96351b8
(5) 0xed9ea4b5f9b69eba09e408db3d4341c6754bbc1d3cd7b66a61c31018736203bd
(6) 0x5d0bb0859a2937b75484ad610ab880702e85f19104f21603680c66a0c76a5208
(7) 0x2909705b13a26498ad3deb1f2fbb2c65ed4d8df018eee5061dc2f76ca997b48d
(8) 0x695d539a3a5e2ffb35a36dfb78a01a58fff883cdf08f39209a7a652c8fd1189d
(9) 0x8d24adf5c1456d6e6d7c1b37f7c7a5036efeb39b799e8a234c0b864fefc38d32
HD Wallet
==================
Mnemonic: hub cloth nice artist wall sail decline rice endorse differ area camera
Base HD Path: m/44'/60'/0'/0/{account_index}
Gas Price
==================
20000000000
Gas Limit
==================
6721975
Call Gas Limit
==================
9007199254740991
Listening on 127.0.0.1:8545
ganache-cli启动成功后,回到myproject项目的目录中,执行迁移命令:
$ truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 1610168223472
> Block gas limit: 6721975 (0x6691b7)
1_initial_migration.js
======================
Deploying 'Migrations'
----------------------
> transaction hash: 0xf3696426daea0a2c20148014fbbf793de1a09360c7dbbee2138c03e38dd8fe76
> Blocks: 0 Seconds: 0
> contract address: 0x64F97533057e353B267f1A4AD6E9085E755B1715
> block number: 1
> block timestamp: 1610172425
> account: 0x817b21276A314E454D8911b72F2e3eEDc7A4590b
> balance: 99.99626074
> gas used: 186963 (0x2da53)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00373926 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00373926 ETH
2_storage_migration.js
======================
Deploying 'Storage'
-------------------
> transaction hash: 0x1967eb25296ca2cd359d0a5242e6d5f8cb293ea3d73fde84ad064c2b5caa79ba
> Blocks: 0 Seconds: 0
> contract address: 0xe4379c94723384f2536f7424bC7f286630922e1c
> block number: 3
> block timestamp: 1610172429
> account: 0x817b21276A314E454D8911b72F2e3eEDc7A4590b
> balance: 99.99329598
> gas used: 105903 (0x19daf)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00211806 ETH
> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00211806 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.00585732 ETH
truffle migrate命令会执行所有位于migrations目录内的所有迁移文件。truffle migrate只会执行新创建的迁移。可以使用–reset来重新执行全部迁移脚本。
$ truffle migrate --reset
3. 初始化迁移合约
在之前有提到一个特殊的合约Migration.sol,这里详细了解一下这个合约。为了使用迁移功能,Truffle要求要有一个迁移合约。这个合约必须包含一个特定的接口,对于大多数项目来说,这个合约只会在第一次做迁移的时候被部署,以后都不会做任何的更改了。当第一次使用truffle init来创建一个项目的时候,它会默认创建这个合约。文件名为contracts/Migration.sol。
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;
contract Migrations {
address public owner = msg.sender;
uint public last_completed_migration;
modifier restricted() {
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
}
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}
为了利益迁移的特性,首先必须部署Migration.sol合约。维持创建一下的迁移脚本。名为migrations/1_initial_migration.js。
const Migrations = artifacts.require("Migrations");
module.exports = function (deployer) {
deployer.deploy(Migrations);
};
要部署其他合约,可以使用递增数字变换前缀来创建新的迁移脚本。
4. 部署器(deployer)
迁移脚本会使用deployer对象来组织部署任务。deployer对象会同步执行部署任务,隐藏可以按顺序编写部署任务。
//先部署A,再部署B
deployer.deploy(A);
deployer.deploy(B);
另外,deployer上的每一个函数都会返回一个promise,通过promise可以把有执行顺序依赖关系的部署任务组成队列。
//先部署A,然后部署B,把A部署后的地址传给B
deployer.deploy(A).then(function(){
return deployer.deploy(B, A.address);
});
5. deployer API
deployer对象中包含许多方法,可以用来简化迁移工作。 (1)deployer.deploy(CONTRACT, ARGS…,OPTIONS) 这个API是用来部署合约的。contract参数传入需要部署的合约名字;args参数传入合约的构造函数需要的参数;options是一个可选参数,它的值是{overwrite:true/false}。如果overwrite被设置成false,那么当合约之前已经部署过了,这个deployer就不会再部署这个合约了,这在一个合约的依赖由一个外部合约地址提供的情况下是有用的。
为了快速进行部署多个合约,可以向deployer.deploy(…)函数中传入一个或多个数组。例子:
// 部署单个合约,不带任何构造参数
deployer.deploy(A);
// 部署单个合约带有构造参数
deployer.deploy(A, arg1, arg2, ...);
// 部署多个合约,一些带构造参数,一些不带构造参数.
// 比写3次 `deployer.deploy()` 语句更快, 因为deployer可以把所有的合约部署都一次性打包提交
deployer.deploy([
[A, arg1, arg2, ...],
B,
[C, arg1]
]);
// 外部依赖的例子:
//
// overwrite: false 表示,如果 SomeDependency 合约之前已经被部署过,那么不在重新部署,直接使用之前已部署好的地址
// 如果我们的合约要运行在自己的测试链上,或者将要运行的链上没有SomeDependency合约,
// 那么把overwrite: false改成overwrite: true,表示不在检查之前SomeDependency有没有部署过,一律覆盖部署。
deployer.deploy(SomeDependency, {overwrite: false});
(2) deployer.link(LIBRARY, DESTINATIONS)把一个已部署好的库链接到一个或多个合约里。destinations 可以传入一个合约,也可以传入一组合约。 如果 destinations中的某个合约不依赖这个库,那deployer 的link函数就会忽略这个合约。
// 部署库LibA,然后把LibA 链接到合约B,然后部署合约B.
deployer.deploy(LibA);
deployer.link(LibA, B);
deployer.deploy(B);
//库LibA链接到多个合约
deployer.link(LibA, [B, C, D]);
(3) deployer.then(function() {…})在迁移过程中使用它调用特定合约的函数来部署新的合约,为已部署的合约做一些初始化工作等。例子:
var a, b;
deployer.then( function() {
// 部署合约A的一个新版本到网络上
return A.new();
}).then( function(instance) {
a=instance;
// 获取已部署的合约B的实例
return B.deployed();
}).then( function(instance) {
b=instance;
// 使用合约B的setA()方法设置A的地址的新实例.
return b.setA(a.address);
});
(4) 网络相关在执行迁移时,迁移脚本会把truffle.js里配置的networks传递给你,你可以在module.exports导出函数中第二个参数位置接受这个值。文件:truffle.js:
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
}
}
};
在迁移脚本中接收network:
module.exports=function(deployer, network) {
if(network=="live") {
// 当不在"live"的网络上的时候,做一些特定的操作.
} else{
// 当在的时候,做一些其他的操作.
}
}
(5) 可用的账户在执行迁移时,迁移脚本会把当前以太坊客户端或web3.provider中可用的账户列表传递给你,这个列表与web3.eth.getAccounts()返回的账户列表完全一样。你可以在module.exports导出函数中第三个参数位置接受这个值。
module.exports=function(deployer, network, accounts) {
//在你的迁移脚本中使用账户
}
优惠劵
Famidlistimo
关注
关注
4
点赞
踩
13
收藏
觉得还不错?
一键收藏
知道了
1
评论
【区块链开发入门】(四) Truffle详解篇1
目录一、什么是Truffle二、安装Truffle一、什么是TruffleTruffle是针对基于以太坊的Solidity语言的一套开发框架。本身基于Javascript。Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,旨在让以太坊上的开发变得简单,Truffle有以下:内置的智能合约编译,链接,部署和二进制文件的管理。利用快速开发的自动合约测试。可脚本化的,可扩展的部署与发布框架。网络管理,用于部署到任意数量的公网或私网的网络环支持持续集成可配置构建管道。与合约直接
复制链接
扫一扫
专栏目录
区块链(三、Truffle使用)
funtaster的博客
08-12
5435
Truffle是什么?
Truffle是基于基于Javascript,对于以太坊Solidity语言的一套开发框架,目的是为了让开发更容易。有一下功能:
●内置的智能合约编译,链接,部署和二进制文件的管理。
●快速开发下的自动合约测试。
●脚本化的,可扩展的部署与发布框架。
●部署到不管多少的公网或私网的网络环境管理功能
●使用EthPM&NPM提供的包管理,使用ERC190标准。
●与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
●可配的构建流程,支持紧密集成。
●在Truf
以太坊 Truffle实战
2301_77819978的博客
04-24
124
整个过程主要演示chrome扩展 METAMASK, OpenZepplin库和truffle框架的使用。
1 条评论
您还未登录,请先
登录
后发表或查看评论
Truffle详解
培根芝士的专栏
12-28
1913
以太坊最受欢迎的开发框架是使用web3.js的Truffle。
Truffle使用以太坊虚拟机(EVM)为区块链提供世界一流的开发环境、测试框架和资产管道,旨在让开发人员的生活更轻松。
内置智能合约编译、链接、部署和二进制管理。
快速开发的自动化合约测试。
脚本化、可扩展的部署和迁移框架。
用于部署到任意数量的公共和专用网络的网络管理。
使用EthPM和NPM进行软件包管理,使用ERC190标准。
用于直接合约通信的交互式控制台。
支持紧密集成的可配置构建管道。
在Truffle环境中执行
以太坊区块链积分系统truffle项目源代码
09-06
以太坊区块链积分系统truffle项目源代码,本人注释过了,最重要的文件是Score.sol 和 app.js ,可以帮助学习以太坊dapp开发
Solidity-以太坊区块链-Truffle-webpack-开发入门 (一) 环境配置
01-07
前言:
本教程全部来自官网,去年2018年底翻译了全部的文档,过了一年了我对当初的学习没什么印象了,不知道有没有错,但确定的是区块链模拟成功的了,所以大家基本不用担心我的笔记有什么大问题,现在2019年底了,我就把我去年的翻译笔记都拿出来分享给大家。共同进步!
笔记截图:
注:本教程使用以太坊的truffle框架在testrpc环境中模拟
系统:Mac OS (windows系统只作为参考)
1. 首先安装nodejs
到官网下载安装即可 http://nodejs.cn/download/
安装之后在终端查看是否安装成功:
$ node -v
如顺利出现版本信息,就表示成功了(失败的
solidity-以太坊区块链Truffle-webpack开发入门 (四) 编写和编译合约
01-20
编译合约 原文地址
编译的命令:
$ truffle compile
这个命令会编译所有contracts目录下的.sol文件,如果在上次编译之后没有改变的的文件不会被重新编译
如果需要重新编译,使用命令:
$ truffle compile —all
*自定义供合约使用的函数库 lib文件也使用.sol结尾
编译后的文件
编译后的文件会被放在build/contracts目录下,这些文件是不能被手动修改的,应该有compiler自动生成
合约的依赖文件的使用方式
使用import命令在contract中倒入依赖包:
import “./AnotherContract.sol”;
这个
Truffle最受欢迎的区块链开发框架
08-08
Truffle - 是以太坊的开发环境,测试框架和资产管道,旨在解放太坊开发人员。
Truffle 开发入门
StevenX5
01-06
1250
Truffle 是一个以太坊智能合约集成开发框架。Truffle 使用以太坊虚拟机(EVM)为区块链提供了世界级的开发环境、测试框架和资产管道,旨在让开发人员的工作更轻松。本文我们从一个 Truffle 官方示例入手,带你快速了解利用 Truffle 开发区块链项目的基础知识,包括 Truffle 项目的创建,智能合约的编译与部署,以及 Truffle 与智能合约进行交互实现区块链上的交易。
以太坊开发框架——Truffle的基础使用
热门推荐
david2000999的博客
09-25
1万+
这里写目录标题TruffleTruffle 简介Truffle 的客户端安装Truffle创建项目Migrationartifacts.require()exports 的函数deployer 对象更新 migration 文件更新 truffle 配置文件创建账户(可用 metamask 上账户转币)部署新建 JavaScript 文件 app/scripts/index.js
Truffle
Truffle 简介
truffle unbox webpack 一条命令由于要下载众多需要的模块,大概耗时 1
使用Truffle编译智能合约及所遇到的问题
henulmh的博客
09-06
3059
解决方式:solidity版本问题,别选太高,好像是8的话address不支持可支付需要带payable,但带上payable,truffle编译合约会报这个错误。migration有关的脚本代码都保存在Truffle的migrations目录,初始时该目录下有一个1_initial_migration.js文件,用来部署Migrations.sol自身。解决方式:选用6版本以上的solidity,并在truffle-config文件中绑定。配置本地以太坊网络和远程的以太坊测试网络方式有所差异,可见上方。
truffle入门(一)--【区块链】
m0_72435337的博客
07-25
402
下载安装nodejs,快速入门truffle进行测试
solidity-以太坊区块链Truffle-webpack开发入门 (十四) 网络和应用部署
01-08
网络和应用部署
原文连接
即使最小的dapp也会有两个区块,一个放在开发机器上,一个发布出去(放在公网Ethereum或者是私链上),truffle有一套系统可以分别管理每个网络上的编译和部署,指定一个网络部署合约:
$ truffle migrate --network live
当指定了一个新的网络部署时,编译后的文件 ./build/contracts 中的.json文件会自动更新,在其中会记录每个网络对应的合约配置信息,当运行时会根据连接的网络自动启用相应的合约。
因为在合约的编译文件运行时会自发现网络,所以你只需要部署一次合约,运行的Ethereum客户端会决定使用哪个合约的编译文
Truffle官方文档中文版
03-07
以太坊DApp开发框架Truffle的官方文档的中文版本。必备。
区块链学习(四)truffle部署编译智能合约以太坊私有链
06-30
1023
前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中。
搭建环境及需使用的工具:ubuntu18.04Truffle v5.0.18 geth1.8.27Nodev10.16.0
solc 0.5.8+commit.23d335f2.Linux.g++
在我们部署一个简单的合约之前...
如何使用Truffle开发太坊智能及其区块链
m0_66117547的博客
04-23
1032
truffle是以太坊(ethereum)开发智能合约(smart contract)过程中最受欢迎的框架,本教程来安装构建一个基本的Truffle项目并部署一个智能合约到区块链。truffle是以太坊(ethereum)开发智能合约(smart contract)过程中最受欢迎的框架,本教程来安装构建一个基本的Truffle项目并部署一个智能合约到区块链。开始本文之前希望你已经了解区块链、以太坊、智能合约等基本概念。
【区块链-智能合约工程师】第四篇:Truffle框架安装和介绍(Windows)
soldi_er的博客
01-03
2784
Truffle 是目前最流行的以太坊 DApp 开发框架,(按照官网说法)是一个世界级的开发环境和测试框架,也是所有使用了 EVM 的区块链的资产管理通道,它基于 JavaScript,致力于让以太坊上的开发变得简单。内置的智能合约编译,链接,部署和二进制文件的管理。合约自动测试,方便快速开发。脚本化的、可扩展的部署与发布框架。可部署到任意数量公网或私网的网络环境管理功能使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
以太坊:Truffle 概述
跨链技术践行者
05-09
1万+
Truffle 概述
Truffle 是一个在以太坊进行 DApp 开发的世界级开发环境、测试框架。它在使开发人员更轻松。这里有几篇博客让我们了解如何开发DApp:
开发、部署第一个去中心化应用 (Dapp) - 宠物商店
使用 Truffle 开发以太坊投票 DAPP
DApp 教程:用 Truffle 开发一个链上记事本
使用 Truffle 开发有一以下优...
truffle
henulmh的博客
08-04
2324
Truffle套件是一个开发以太坊 (Ethereum) 区块链DApp (分布式应用程序) 的开发环境,是开发DApp的一站式解决方案,功能包括:编译合约、部署合约、开发DApp前端、测试DApp等。
truffle使用
weixin_44932880的博客
05-17
3075
1.下载
npm install -g truffle
2.使用
创建没有合约的空工程
truffle init
或下载模板
truffle unbox metacoin
在操作完成之后,就有这样的一个项目目录结构:
contracts/: Solidity合约目录
migrations/: 部署脚本文件目录
test/: 测试脚本目录
truffle-config.js: Truffle 配置文件
编译合约
truffle compile
仅编译自上次编译以来有更改的合约。 如果我们想覆盖此行为
vue + truffle
最新发布
01-14
Vue + Truffle是一种常用的组合,用于创建以太坊Dapp(去中心化应用程序)。Vue是一个流行的JavaScript框架,用于构建用户界面,而Truffle是一个用于开发以太坊智能合约的开发框架。结合使用Vue和Truffle可以轻松地构建具有交互性和响应性的以太坊Dapp。
以下是使用Vue + Truffle创建以太坊Dapp的步骤:
1. 安装Truffle和Ganache:
Truffle是一个用于开发以太坊智能合约的开发框架,而Ganache是一个用于在本地开发和测试以太坊应用程序的个人区块链。
```shell
npm install -g truffle
npm install -g ganache-cli
```
2. 创建一个新的Truffle项目:
在命令行中,进入你想要创建项目的目录,并执行以下命令:
```shell
truffle init
```
3. 创建一个新的Vue项目:
在命令行中,进入你想要创建项目的目录,并执行以下命令:
```shell
vue create my-dapp
```
4. 配置Truffle项目:
在Truffle项目的根目录下,打开truffle-config.js文件,并进行以下配置:
- 配置网络:将网络配置为连接到Ganache个人区块链。
- 配置合约:将合约编译和部署到以太坊网络。
5. 编写智能合约:
在Truffle项目的contracts目录下,编写你的智能合约。
6. 编写Vue组件:
在Vue项目的src目录下,编写你的Vue组件,用于与智能合约进行交互。
7. 部署智能合约:
在命令行中,进入Truffle项目的根目录,并执行以下命令来部署智能合约:
```shell
truffle migrate
```
8. 运行Vue项目:
在命令行中,进入Vue项目的根目录,并执行以下命令来运行Vue项目:
```shell
npm run serve
```
现在,你已经成功地使用Vue + Truffle创建了一个以太坊Dapp。你可以在Vue组件中调用智能合约的方法,并与以太坊网络进行交互。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
Famidlistimo
CSDN认证博客专家
CSDN认证企业博客
码龄5年
暂无认证
40
原创
5万+
周排名
170万+
总排名
9万+
访问
等级
949
积分
778
粉丝
84
获赞
81
评论
531
收藏
私信
关注
热门文章
CDH、HDH、IDH、DDH、BDH、DBDH假设的概念
13175
群、环、域知识点整理(持续补充ing)
7071
【待解决】Hyperledger Fabric开发中生成Channel时出现Error: Post “https://localhost:7053/participation/v1/channels“
7010
Latex中如何另取一页
5342
【2020年保研夏令营分享】武大网安、厦大计算机、东南网安
4654
分类专栏
区块链
14篇
Hyperledger
10篇
数据库
其他
1篇
信息安全数学
4篇
C++
2篇
夏令营
1篇
数据结构
7篇
编译原理
1篇
LaTeX
3篇
Machine Learning
1篇
Paper
1篇
计算机网络
1篇
windows
3篇
最新评论
Fabric 2.2.0上搭建Hyperledger caliper进行性能测试
weixin_44797738:
大佬我想请教您,可以随便绑定一个与自己运行的Fabric版本不一样的SUT吗?我自己使用的fabric版本是2.5,可是caliper最高SUT的绑定是2.4
Fabric 2.2.0上搭建Hyperledger caliper进行性能测试
weixin_44797738:
谢谢大佬 很有帮助
Fabric 2.2.0上搭建Hyperledger caliper进行性能测试
JDBaby:
请问楼主,我在运行最后一步的时候报了这个错误,这个应该如何修改呢?Error: Failed to connect before the deadline on Endorser- name: peer0.org1.example.com, url:grpcs://localhost:7051, connected:false, connectAttempted:true
CDH、HDH、IDH、DDH、BDH、DBDH假设的概念
m0_74362852:
老妈身上的装备我
【Hyperledger Fabric入门】(二) Fabric账号服务器:Fabric-ca
qq_51236576:
我想请问一下作者,如果用cryptogen工具生成的证书文件,想利用CA注册用户,需要重新用CA生成组织文件嘛
大家在看
2024年需要重点关注的15种计算机病毒
Linux 相关命令
220
Java+SSM+JSP高校宿舍管理系统源码+论文+答辩PPT
142
LVS+Keepalived 高可用负载均衡集群
546
20240307-1-前端开发校招面试问题整理JavaScript
最新文章
【已解决】NO_PEERS_FOUND. Description: targets were not provided
Fabric 2.2.0上搭建Hyperledger caliper进行性能测试
docker方式简单部署blockchain-explorer
2021年14篇
2020年29篇
目录
目录
分类专栏
区块链
14篇
Hyperledger
10篇
数据库
其他
1篇
信息安全数学
4篇
C++
2篇
夏令营
1篇
数据结构
7篇
编译原理
1篇
LaTeX
3篇
Machine Learning
1篇
Paper
1篇
计算机网络
1篇
windows
3篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
【Truffle】一、Truffle的安装与部署_truffle安装-CSDN博客
>【Truffle】一、Truffle的安装与部署_truffle安装-CSDN博客
【Truffle】一、Truffle的安装与部署
奈何不吃鱼
已于 2023-10-28 09:41:31 修改
阅读量1.9k
收藏
6
点赞数
7
分类专栏:
Truffle
文章标签:
区块链
solidity
truffle
智能合约
测试
压力测试
于 2023-10-27 23:46:15 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/naihe_fish/article/details/134084390
版权
Truffle
专栏收录该内容
4 篇文章
0 订阅
订阅专栏
目录
一、准备安装
二、安装truffle
三、创建 Truffle 项目工程
1.为 Truffle 项目创建新目录:
2.下载 (“unbox”) MetaCoin box:
四、项目分析
五、测试合约
一、准备安装
安装truffle必须要提前配置Nodejs环境,关于Nodejs的配置,我在之前的文章中提到过版本管理方式,屡试不爽,移步这里查看:【Linux】Ubuntu升级nodejs版本-CSDN博客
需要注意的是,nodejs的版本在官方文档的要求是 v8.9.4 或 之后的版本,然而在实际安装部署Truffle时,尽量建议大家选择更高的版本,避免出现下图的问题!
二、安装truffle
这里我就以nodejs的20版本为例,开始安装Truffle
确定环境准备完成后,执行下面这条命令安装Truffle
npm install -g truffle
安装完成后 ,我们便可以创建工程啦
三、创建 Truffle 项目工程
1.为 Truffle 项目创建新目录:
mkdir MetaCoin
cd MetaCoin
2.下载 (“unbox”) MetaCoin box:
truffle unbox metacoin
这里是下载官方提供的一个合约工程,我们在后期熟练之后可以直接运行truffle init创建一个空的工程
这里如果下载失败了就直接运行此命令,下载的样例代码一样
git clone https://github.com/truffle-box/metacoin-box.git
在操作完成之后,就有这样的一个项目目录结构:
contracts/: 智能合约的存放目录 migrations/: 部署脚本目录 test/: 测试脚本目录 truffle-config.js: Truffle配置文件
四、项目分析
我们下载的这个测试用例,已经是一个比较完整的项目体系了,接下来我们对这个项目结构进行分析
contracts:此目录存放所有需要测试的智能合约,一共有两个合约migrantions:此目录存放了一个部署合约脚本test:目录下存放了测试合约的脚本truffle-config.js:truffle的配置文件,可以修改一些基本信息,也可以引入第三方插件
五、测试合约
正常的流程为:truffle develop(启用测试网络) => compile(编译合约) => migrate(部署合约) => test(测试合约)
我们依次执行命令
truffle develop
compile
migrate
test
直接运行test是执行所有测试脚本
测试全部通过 ,至此,合约测试结束
优惠劵
奈何不吃鱼
关注
关注
7
点赞
踩
6
收藏
觉得还不错?
一键收藏
打赏
知道了
8
评论
【Truffle】一、Truffle的安装与部署
需要注意的是,nodejs的版本在官方文档的要求是 v8.9.4 或 之后的版本,然而在实际安装部署Truffle时,尽量建议大家选择更高的版本,避免出现下图的问题!正常的流程为:truffle develop(启用测试网络) => compile(编译合约) => migrate(部署合约) => test(测试合约)这里是下载官方提供的一个合约工程,我们在后期熟练之后可以直接运行truffle init创建一个空的工程。这里我就以nodejs的20版本为例,开始安装Truffle。
复制链接
扫一扫
专栏目录
truffle使用指南
10-16
dapp开发神器truffle,支持合约编译,部署,调试,简化dapp开发
Win10 搭建truffle框架
qq_50938817的博客
10-04
986
在64位Win10系统系统下,从零开始搭建truffle框架
8 条评论
您还未登录,请先
登录
后发表或查看评论
以太坊学习路线——(四、上)Truffle安装、truffle项目创建、编译、部署
菜鸟博客
04-06
2890
这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战——以太坊关键技术与案例分析 第十章(吴寿鹤、冯翔、刘涛、周广益 著)。鉴于内容较多,分成两篇,下一篇博文请见:以太坊学习路线——(四、下)truffle项目合约交互、合约测试、配置文件、依赖管理
文章结构:
一、Truffle简介
二、安装Truffle
三、创建并初始化项目
四、创建合约
五、编译合约
...
使用Truffle时遇到的问题和解决方法
01-07
问题1
错误信息
Error: CompileError: /C/Users/media/ethereum_work/course3/contracts/Ballot.sol:1:1: ParserError: Source file requires different compiler version (current compiler is 0.5.12+commit.7709ece9.Emscripten.clang – note that nightly builds are considered to be strictly less than the released versi
truffle-starter-kit:一个使用 Chainlink 的智能合约示例
07-24
Chainlink 松露盒
要求
新产品管理
安装
安装松露
npm install truffle -g
设置仓库
mkdir MyChainlinkProject
cd MyChainlinkProject/
拆箱
truffle unbox smartcontractkit/box
通过运行安装依赖项:
npm install
# OR...
yarn install
测试
npm test
部署
为了部署到 kovan 网络,Truffle 将使用truffle-hdwallet-provider作为您的助记符和一个 RPC URL。 在运行之前设置环境变量$RPC_URL和$MNEMONIC $RPC_URL :
npm run migrate:kovan
您还可以运行:
truffle migrate --network kovan --reset
如果你想使用
【区块链-智能合约工程师】第四篇:Truffle框架安装和介绍(Windows)
soldi_er的博客
01-03
2784
Truffle 是目前最流行的以太坊 DApp 开发框架,(按照官网说法)是一个世界级的开发环境和测试框架,也是所有使用了 EVM 的区块链的资产管理通道,它基于 JavaScript,致力于让以太坊上的开发变得简单。内置的智能合约编译,链接,部署和二进制文件的管理。合约自动测试,方便快速开发。脚本化的、可扩展的部署与发布框架。可部署到任意数量公网或私网的网络环境管理功能使用 EthPM 和 NPM 提供的包管理,使用 ERC190 标准。
truffle 安装教程
weixin_44565776的博客
01-07
1354
truffle 安装教程
如何在windows11上安装智能合约Truffle框架
weixin_52943021的博客
05-29
284
新建系统变量:NODE_PATH/D:\npm\node_modules,PATH变量中添加值D:\npm\myNodelobal。首先要安装nodejs环境版本必须18以上,这个是最常见的,就不多说。1.全局安装ganache-cli节点仿真器:v6.12.2。2.全局安装solc编译器:solc@0.8.17。3.全局安装web库:web3@1.8.1。第二步设置安装模块和缓存文件的目录。4.全局安装truffle开发框架。5.全局安装webpack打包器。好了,可以编写智能合约代码。
Truffle(部署+测试)
m0_46635662的博客
11-08
384
这里我就以nodejs的16版本为例,开始安装Truffle确定环境准备完成后,执行下面这条命令安装Truffle安装vscode 插件,下载完成会多一个这个标志,然后点进去,检测让你下载几个东西,按照提示下载即可。
Windows10下安装Truffle工具
xuecuilan的博客
05-20
6478
首先安装好node和npm,因为ganache是用JavaScript编写的,并通过node包中的npm,如下:
注意:这里最好安装和我一样的版本,免得因为版本问题导致一些未知的错误!!!
接下来安装Truffle
npm install -g truffle
首先遇到的问题如下:报错说没有python环境
解决没有python环境的问题:
我们选择安装windows-bu...
truffle_eth_class2
02-05
扎实的DApp开发课程资料
这是您在本课程中编写的所有代码的官方存储库。
该课程可在有限时间内找到,价格为15美元: :
范围
该代码的范围旨在显示您可以在Solidity,以太坊,Web3,Truffle,以太坊Studio等中实现的目标。特别是:
演示如何使用以太坊区块链
Web3
倾听并对特定事件做出React
编写测试用例
部署DApp
使用混音
使用MetaMask
使用Truffle和WebPack
安装说明
格思
从为您的平台下载geth
Geth Mac-OS:
将下载zip中的“ geth”文件复制到以下文件夹中:
“ / usr / local / bin
create-truffle-dapp:无需配置即可创建和部署Truffle项目
02-05
创建松露Dapp
介绍
创建Truffle Dapp的目的是帮助开发人员无需配置即可创建和部署Truffle项目。 创建松露Dapp将:
使用模板合同,测试文件和相应的迁移文件创建Truffle项目
使用您的项目ID和钱包助记符创建一个现成的部署文件
此外,密实度棉绒(如或)配置文件也可以被创建。
Create Truffle Dapp应该可以在Windows,Macos和Linux上运行。 如果无法解决请。
在你开始之前
首先,请确保在计算机上安装了 , 和 。 您可能还需要棉短绒,如 ,或 。
安装
使用以下命令全局安装Create Truffle Dapp:
npm install
harmony-box:和谐的松露盒-使用Truffle和本地以太坊工具将智能合约部署到Harmony
05-15
和声盒
Harmony Box是一个Truffle框,可让您使用Truffle和本机以太坊工具快速启动并运行在Harmony上部署智能合约。
入门
松露
如果您在全球范围内安装了Truffle:
(直到包装盒被Truffle批准,您必须依靠下面的git安装步骤)
mkdir harmony && cd harmony
truffle unbox harmony
或者,如果您想通过git安装:
git clone https://github.com/harmony-one/harmony-box.git
cd harmony-box
.env
将.env-example复制到.env:
cp .env-example .env
修改.env并将每个网络的“ ENTER_PRIVATE_KEY_HERE ”替换为您要在部署合同时使用的相应私钥。
依存关系
使用yarn安装所有
章鱼网络进展月报 | 2024.2.1-2.29
最新发布
OctopusNetwork的博客
03-06
461
Omnity 首先支持 Runes 资产跨链。
多重验证及比特币脚本中的P2PK、P2PKH、P2SH机制
weixin_52421133的博客
03-03
760
总结来说,二重验证为加密货币资产提供了一种更高级别的安全保障,而比特币赎回脚本系统中的P2PK、P2PKH、P2SH交易类型,则从不同的维度优化了交易过程,既保证了安全性又提升了效率。深入理解和掌握这些概念和技术,有助于我们在数字货币世界中更好地保障资产安全,应对日益复杂的交易需求。未来,随着区块链技术的发展,我们期待看到更多创新的验证机制和交易形式的出现。
【01】区块链科普100天-模块化区块链
总要有点可以骄傲的东西
02-29
641
这不仅减轻了主链的负担,也为开发者提供了更大的灵活性和创新空间。lgnis是基于Ardor公链的一个子链,母子链架构增强了网络性能,而且提供了更高的灵活性,这种架构不仅增强了网络的性能,而且提供了很高的灵活性,适合快速发展和部署DApp。1.层次架构:传统区块链将所有任务,如交易处理、共识机制、数据存储等集成在单一层中,模块化区块链将这些功能分割成独立的层,实现更高效的处理和升级。2.可拓展性:模块化区块链中,不同功能的隔离提高了整体网络的安全性,即使某一模块出现安全问题,也不会影响整个网络。
如何做代币分析:以 USDC 币为例
m0_60517769的博客
03-06
285
USDC 是最透明和值得信赖的稳定币之一,因为每个流通中的 USDC 代币都有相应数量的美元储备。
什么是区块链粉尘攻击?
J_Lee
03-02
970
什么是区块链粉尘攻击?
Kakarot:当今以太坊的未来
mutourend的博客
03-06
873
Kakarot:当今以太坊的未来
truffle部署合约
09-13
您好!感谢您的提问!来自 C 知道的我将为您解答关于使用 Truffle 部署合约的问题。
要使用 Truffle 部署合约,您可以按照以下步骤进行操作:
1. 首先,确保您已经在您的项目中安装了 Truffle。如果没有安装,可以通过运行以下命令进行安装:
```
npm install -g truffle
```
2. 确保您已经在项目目录中初始化了 Truffle,可以通过运行以下命令完成初始化:
```
truffle init
```
3. 在项目目录中,您需要在 `contracts` 文件夹中编写您的智能合约代码。例如,您可以创建一个名为 `MyContract.sol` 的文件,并编写您的合约代码。
4. 在部署合约之前,您需要配置 Truffle 的网络设置。打开项目目录中的 `truffle-config.js`(或 `truffle.js`,取决于您的项目版本),并根据需要配置网络。例如,您可以添加一个名为 "development" 的网络配置:
```javascript
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*",
}
},
};
```
5. 在部署之前,您可以通过运行以下命令来编译您的合约:
```
truffle compile
```
6. 最后,您可以使用以下命令来部署合约:
```
truffle migrate --network development
```
上述命令将在您配置的 "development" 网络上部署合约。如果您配置了其他网络,请相应地更改命令中的网络名称。
这就是使用 Truffle 部署合约的基本步骤。希望能对您有所帮助!如果您有任何其他问题,请随时提问。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
奈何不吃鱼
CSDN认证博客专家
CSDN认证企业博客
码龄1年
暂无认证
43
原创
16万+
周排名
3万+
总排名
5万+
访问
等级
767
积分
753
粉丝
246
获赞
61
评论
250
收藏
私信
关注
热门文章
【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend
4733
【FISCO-BCOS】 六、节点黑白名单操作
4120
IntelliJ IDEA创建javaweb项目入门级教程
3149
【Vue】从零开始创建一个Vue项目(详细步骤)
2730
【Linux】Ubuntu升级nodejs版本
2246
分类专栏
FISCO BCOS
付费
20篇
Vue学习
2篇
Truffle
4篇
Github
2篇
问题解决
5篇
solidity合约案例
3篇
Linux
5篇
openstack
2篇
JavaWeb
1篇
java小题目
1篇
最新评论
【FISCO-BCOS】十四、使用Caliper进行压力测试fisco-bcos
imomsc_csdn:
您好大佬,请问在第四步时对npm进行初始化时,出现了报错,说权限不够,但用sudo权限之后又显示node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)。请问您之前遇到过类似的情况吗?谢谢
OpenSSL:提示检测失败:Please install openssl!use “openssl version“ commond to check.
奈何不吃鱼:
就是用vim或者vi,把build_chain.sh其中一行对openssl的版本要求改成你自己的版本即可
OpenSSL:提示检测失败:Please install openssl!use “openssl version“ commond to check.
2301_82051277:
请问怎么改啊 第二个步骤看不懂
OpenSSL:提示检测失败:Please install openssl!use “openssl version“ commond to check.
wbint:
请问为什么我改了之后还是提示“[INFO] Use "openssl version" command to check.”
【FISCO BCOS】十九、区块链浏览器部署
小梁说代码:
受益了,支持博主!
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【Vue】二、Vue 组件展示控制的优雅解决方案
【Github】如何创建一个自己的仓库
【GitHub】ssh: connect to host github.com port 22: Connection refused
2024年3篇
2023年40篇
目录
目录
分类专栏
FISCO BCOS
付费
20篇
Vue学习
2篇
Truffle
4篇
Github
2篇
问题解决
5篇
solidity合约案例
3篇
Linux
5篇
openstack
2篇
JavaWeb
1篇
java小题目
1篇
目录
评论 8
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
奈何不吃鱼
你的鼓励将是我创作的最大动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
用以太坊开发框架Truffle开发智能合约实践攻略(代码详解) - 知乎
用以太坊开发框架Truffle开发智能合约实践攻略(代码详解) - 知乎首发于HiBlock区块链社区切换模式写文章登录/注册用以太坊开发框架Truffle开发智能合约实践攻略(代码详解)yaoyao路是什么,走着走着就知道了1TRUFFLE是什么?Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下:内置的智能合约编译,链接,部署和二进制文件的管理。快速开发下的自动合约测试。脚本化的,可扩展的部署与发布框架。部署到不管多少的公网或私网的网络环境管理功能使用EthPM&NPM提供的包管理,使用ERC190标准。与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。可配的构建流程,支持紧密集成。在Truffle环境里支持执行外部的脚本。【说明】更多以太坊术语可参考此篇文章:https://www.jianshu.com/p/03666198619d1.1 TRUFFLE的安装在Ubuntu命令上窗口输入以下命令,完成安装:$ npm install -g truffle如果安装成功,可输入truffle version名称,正常情况下会有版本显示:truffle version环境要求NodeJS 5.0+Windows,Linux(推荐Ubuntu),或Mac OS XTruffle客户端有许多的以太坊客户端可以选择。我们推荐在开发和部署时使用不同客户端。适用开发的客户端EtherumJS TestRPC当开发基于Truffle的应用时,我们推荐使用EthereumJS TestRPC。它是一个完整的在内存中的区块链仅仅存在于你开发的设备上。它在执行交易时是实时返回,而不等待默认的出块时间,这样你可以快速验证你新写的代码,当出现错误时,也能即时反馈给你。它同时还是一个支持自动化测试的功能强大的客户端。Truffle充分利用它的特性,能将测试运行时间提速近90%。适用正式发布的客户端Geth (go-ethereum)WebThree(cpp-ethereum)More对此有许多官方和非官方的以太坊客户端可供选择。最好使用TestRPC客户端充分测试后,再使用这些客户端。这些是完整的客户端实现,包括挖矿,网络,块及交易的处理,Truffle可以在不需要额外配置的情况下发布到这些客户端。当发布到私有网络中私人网络中使用了相同的技术,但却有不同的配置。所以你可以将上面提及的客户端来运行一个私有的网络,部署到这样的网络也是使用同样的方式。【说明】作者使用TestRPC和 Geth (go-ethereum)这2种客户端,他们的安装方式参考文章:https://www.jianshu.com/p/683ea7d62a392下载TRUFFLE MetaCoin样例进行环境搭建实战2.1 MetaCoin初始化我们假设前面的安装和环境搭建已全部成功,此时应该可以直接使用命令truffle了,下面我们建立一个工作间truffle-workspace,然后在工作间执行:mkdir MetaCoin
cd MetaCoin
truffle unbox metacoin
原来使用truffle init,但现在它存在于unbox。执行截图如下:下载样例unboxTruffle 的盒子Boxs装有很多非常实用的项目样板,可以让你忽略一些环境配置问题,从而可以集中与开发你自己的DApp的业务唯一性。除此之外,Truffle Boxes能够容纳其他有用的组件、Solidity合约或者库,前后端视图等等。所有这些都是一个完整的实例Dapp程序。都可以下载下来逐一研究,寻找适合自己公司目前业务模型的组件。Truffle的官方Boxes地址(http://truffleframework.com/boxes/)可以看到,现在官方盒子还不多,总共7个,有三个是关于react的,两个是truffle自己的项目,可以下载体验,剩下两个是我们比较关心的,一个是metacoin,非常好的入门示例,另一个是webpack,顾名思义,它是一套比起metacoin更加完整的模板的存在。既然我们是初学,下面我们就从metacoin入手学习。2.2 目录结构及文件解读进入metacoin目录,当前目录已经被初始化成一个新的空的以太坊工程,目录结构如下:contractsConvertLib.solMetaCoin.solMigrations.solplaceholdermigrations1_initial_migration.js2_deploy_contracts.jstestmetacoin.jsTestMetacoin.solplaceholdertruffle-config.jstruffle.js初始化文件解释1:Migrations.solpragma solidity ^0.4.2;
contract Migrations {
address public owner;
uint public last_completed_migration;
modifier restricted() {
if (msg.sender == owner) _;
}
function Migrations() public {
owner = msg.sender;
}
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
function upgrade(address new_address) public restricted {
Migrations upgraded = Migrations(new_address);
upgraded.setCompleted(last_completed_migration);
}
}上面我们学习了Solidity具体的类型语法,我们来分析一下这个文件:它定义了一个名字为“迁移”的合约有一个任意访问的全局变量,存储于storage的地址类型变量owner有一个可任意访问的全局变量,存储于storage的无符号整型类型的变量last_completed_migrationmodifier下面细说,此处略过msg.sender下面细说,此处略过构造函数,初始化将发送方赋值给owner保存一个setCompleted赋值方法,赋值给last_completed_migration,其中该方法被声明为restricted,下面细说,此处略过upgrade方法,调用当前合约自己的方法,得到合约的实例upgraded,然后通过该是咧调用setCompleted赋值方法。Solidity语法补充说明1:function modifiermodifier的使用方法,就看上面的Migrations合约的例子即可,它可以自动改变函数的行为,例如你可以给他预设一个条件,他会不断检查,一旦符合条件即可走预设分支。它可以影响当前合约以及派生合约。pragma solidity ^0.4.11;
contract owned {
function owned() public { owner = msg.sender; }
address owner;
// 这里仅定义了一个modifier但是没有使用,它将被子类使用,方法体在这里“_;”,这意味着如果owner调用了这个函数,函数会被执行,其他人调用会抛出一个异常。
modifier onlyOwner {
require(msg.sender == owner);
_;
}
}
// 通过is关键字来继承一个合约类,mortal是owned的子类,也叫派生类。
contract mortal is owned {
// 当前合约派生了owned,此方法使用了父类的onlyOwner的modifier
// public onlyOwner, 这种写法挺让人困惑,下面给出了我的思考,暂理解为派生类要使用基类的modifier。
function close() public onlyOwner {
selfdestruct(owner);
}
}
contract priced {
// Modifiers可以接收参数
modifier costs(uint price) {
// 这里modifier方法体是通过条件判断,是否满足,满足则执行“_;”分支。
if (msg.value >= price) {
_;
}
}
}
contract Register is priced, owned {
mapping (address => bool) registeredAddresses;
uint price;
// 构造函数给全局变量price赋值。
function Register(uint initialPrice) public { price = initialPrice; }
// payable关键字重申,如果不声明的话,函数关于以太币交易的操作都会被拒回。
function register() public payable costs(price) {
registeredAddresses[msg.sender] = true; }
// 此派生类也要使用基类的modifier。
function changePrice(uint _price) public onlyOwner {
price = _price;
}
}
contract Mutex {
bool locked;
modifier noReentrancy() {
require(!locked);
locked = true;
_;
locked = false;
}
function f() public noReentrancy returns (uint) {
require(msg.sender.call());
return 7;
}
}又延伸出来一个盲点:require关键字,它是错误判断,提到assert就懂了,官方文档的解释为:require(bool condition):
throws if the condition is not met - to be used for errors in inputs or external components.
总结一下modifier:声明modifier时,特殊符号“_;”的意思有点像TODO,是一个“占位符”,指出了你要写的具体方法体内容的位置。function close() public onlyOwner,派生类某方法想“如虎添翼”加入基类的某个modifier功能,就可以这样写,这行的具体意思就是:close方法也必须是owner本人执行,否则报错!Solidity语法补充说明2:Restricting Access限制访问一种针对合约的常见模式。但其实你永远不可能限制得了任何人或电脑读取你的交易内容或者你的合同状态。你可以使用加密增大困难,但你的合约就是用来读取数据的,那么其他人也会看到。所以,其实上面的modifier onlyOwner是一个特别好的可读性极高的限制访问的手段。那么restricted关键字如何使用呢?好吧,我刚刚带着modifier的知识重新看了上面的Migrations合约的内容发现,restricted并不是关键字,而是modifier的方法名,在其下的想增加该modifier功能的函数中,都使用了public restricted的方式来声明。说到这里,我又明白了为什么要使用public onlyOwner这种写法,因为public是函数可见性修饰符,onlyOwner是自定义的限制访问的modifier方法,他们都是关于函数使用限制方面的,所以会写在一起,可以假想一个括号将它俩括起来,他们占一个位置,就是原来属于public|private|internal|external的那个位置。Solidity语法补充说明3:Special Variables and Functions这一点很重要了,我们研究一下Solidity自身携带的特殊变量以及函数:block.blockhash(uint blockNumber) returns (bytes32): 返回参数区块编号的hash值。(范围仅限于最近256块,还不包含当然块)block.coinbase (address): 当前区块矿工地址block.difficulty (uint): 当前区块难度block.gaslimit (uint): 当前区块的gaslimitblock.number (uint): 当前区块编号block.timestamp (uint): 当前区块的timestamp,使用UNIX时间秒msg.data (bytes): 完整的calldatamsg.gas (uint): 剩余的gasmsg.sender (address): 信息的发送方 (当前调用)msg.sig (bytes4): calldata的前四个字节 (i.e. 函数标识符)msg.value (uint): 消息发送的wei的数量now (uint): 当前区块的timestamp (block.timestamp别名)tx.gasprice (uint): 交易的gas单价tx.origin (address): 交易发送方地址(完全的链调用)msg有两个属性,一个是msg.sender,另一个是msg.value,这两个值可以被任何external函数调用,包含库里面的函数。注意谨慎使用block.timestamp, now and block.blockhash,因为他们都是有可能被篡改的。初始化文件解释2:MetaCoin.solpragma solidity ^0.4.18;
import "./ConvertLib.sol";
// 这是一个简单的仿币合约的例子。它并不是标准的可兼容其他币或token的合约,
// 如果你想创建一个标准兼容的token,请转到 https://github.com/ConsenSys/Tokens(TODO:一会儿我们再过去转)
contract MetaCoin {
mapping (address => uint) balances;// 定义了一个映射类型变量balances,key为address类型,值为无符整型,应该是用来存储每个账户的余额,可以存多个。
event Transfer(address indexed _from, address indexed _to, uint256 _value);// Solidity语法event,TODO:见下方详解。
function MetaCoin() public {// 构造函数,tx.origin查查上面,找到它会返回交易发送方的地址,也就是说合约实例创建时会默认为当前交易发送方的余额塞10000,单位应该是你的仿币。
balances[tx.origin] = 10000;
}
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {// 函数声明部分没有盲点,方法名,参数列表,函数可见性,返回值类型定义。
if (balances[msg.sender] < amount) return false;// 如果余额不足,则返回发送币失败
balances[msg.sender] -= amount;// 否则从发送方余额中减去发送值,注意Solidity也有 “-=”,“+=” 的运算符哦
balances[receiver] += amount;// 然后在接收方的余额中加入发送值数量。
Transfer(msg.sender, receiver, amount);// 使用以上event关键字声明的方法
return true;
}
function getBalanceInEth(address addr) public view returns(uint){// 获取以太币余额
return ConvertLib.convert(getBalance(addr),2);// 调用了其他合约的方法,TODO:稍后介绍ConvertLib合约时说明。
}
function getBalance(address addr) public view returns(uint) {// 获取当前账户的仿币余额
return balances[addr];
}
}
Solidity语法补充说明4:EventsEvents allow the convenient usage of the EVM logging facilities, which in turn can be used to “call” JavaScript callbacks in the user interface of a dapp, which listen for these events.Events提供了日志支持,进而可用于在用户界面上“调用”dapp JavaScript回调,监听了这些事件。简单来说,我们的DApp是基于web服务器上的web3.js与EVM以太坊结点进行交互的,而智能合约是部署在EVM以太坊结点上的。举一个例子:contract ExampleContract {
// some state variables ...
function foo(int256 _value) returns (int256) {
// manipulate state ...
return _value;
}
}合约ExampleContract有个方法foo被部署在EVM的一个结点上运行了,此时用户如果想在DApp上调用合约内部的这个foo方法,如何操作呢,有两种办法:var returnValue = exampleContract.foo.call(2);// 通过web3 的message的call来调用。合约内部再声明一个event ReturnValue(address indexed _from, int256 _value);并在foo方法内使用该event用来返回方法执行结果。第一种办法在方法本身比较耗时的情况下会阻塞,或者不会获取到准确的返回值。所以采用第二种办法:就是通过Solidity的关键字event。event在这里就是一个回调函数的概念,当函数运行结束以后(交易进块),会通过event返回给web3,也就是DApp用户界面相应的结果。这是以太坊一种客户端异步调用方法。关于这个回调,要在DApp使用web3时显示编写:exampleEvent.watch(function(err, result) {
if (err) {
console.log(err)
return;
}
console.log(result.args._value)
// 检查合约方法是否反返回结果,若有则将结果显示在用户界面并且调用exampleEvent.stopWatching()方法停止异步回调监听。
})写Solidity最大的不同在于,我们要随时计算好我们的gas消耗,方法的复杂度,变量类型的存储位置(memory,storage等等)都会决定gas的消耗量。使用event可以获得比storage更便宜的gas消耗。总结一下event,就是如果你的Dapp客户端web3.js想调用智能合约内部的函数,则使用event作为桥梁,它能方便执行异步调用同时又节约gas消耗。初始化文件解释3:ConvertLib.solpragma solidity ^0.4.4;
library ConvertLib{
function convert(uint amount,uint conversionRate) public pure returns (uint convertedAmount)
{
return amount * conversionRate;
}
}与MetaCoin智能合约不同的是,ConvertLib是由library声明的一个库,它只有一个方法,就是返回给定的两个无符整数值相乘的结果。返回到上面的MetaCoin中该库的使用位置去分析,即可知道,MetaCoin的仿币的价格是以太币的一倍,所以MetaCoin是以以太币为标杆,通过智能合约发布的一个token,仿币。这似乎就可以很好地解决我在《以太坊RPC机制与API实例》文章中需要发布三倍以太币的token的需求了,而我们完全不必更改以太坊源码,但那篇文章通过这个需求的路线研究了以太坊的Go源码也算功不可没。初始化文件解释4:1_initial_migration.jsvar Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
} ;
这个js文件是nodejs的写法,看上去它的作用就是部署了上面的Migrations智能合约文件。初始化文件解释5:2_deploy_contracts.jsvar ConvertLib = artifacts.require("./ConvertLib.sol");
var MetaCoin = artifacts.require("./MetaCoin.sol");
module.exports = function(deployer) {
deployer.deploy(ConvertLib);
deployer.link(ConvertLib, MetaCoin);
deployer.deploy(MetaCoin);
};这个文件是meatcoin智能合约的部署文件,里面约定了部署顺序,依赖关系。这里我们看到了MetaCoin智能合约是要依赖于库ConvertLib的,所以要先部署ConvertLib,然后link他们,再部署MetaCoin,这部分js的写法可以参照官方文档DEPLOYER API,主要就是介绍了一下deploy、link以及then三个方法的详细用法,不难这里不再赘述。初始化文件解释6:truffle-config.js, truffle.jsmodule.exports = {
// See
// to customize your Truffle configuration!};
module.exports = {
// See
// to customize your Truffle configuration!
};这两个文件也都是nodejs,他们都是配置文件,可能作用域不同,目前它俩是完全相同的(因为啥也没有)。我们去它推荐的网站看一看。给出了一个例子:module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // Match any network id
}
}
};这个例子展示了该配置文件可以配置网络环境,暂先到这,以后遇上了针对该配置文件进行研究。初始化文件解释7:.placeholderThis is a placeholder file to ensure the parent directory in the git repository. Feel free to remove.翻译过来就是:placeholder文件是用来保证在git库中父级目录的,可以删除。初始化文件解释8:metacoin.js和下面的文件一样,他们的功能都是用来做单元测试的,truffle在编译期间会自动执行这些测试脚本。当前文件为js版本,模拟用户在DApp客户端用户界面操作的情形。var MetaCoin = artifacts.require("./MetaCoin.sol"); // 这与1_initial_migration.js文件的头是一样的,引入了一个智能合约文件。contract('MetaCoin', function(accounts) {
it("should put 10000 MetaCoin in the first account", function() {
return MetaCoin.deployed().then(function(instance) {
return instance.getBalance.call(accounts[0]);
}).then(function(balance) {
assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
});
});
it("should call a function that depends on a linked library", function() {
var meta;
var metaCoinBalance;
var metaCoinEthBalance;
return MetaCoin.deployed().then(function(instance) {
meta = instance;
return meta.getBalance.call(accounts[0]);
}).then(function(outCoinBalance) {
metaCoinBalance = outCoinBalance.toNumber();
return meta.getBalanceInEth.call(accounts[0]);
}).then(function(outCoinBalanceEth) {
metaCoinEthBalance = outCoinBalanceEth.toNumber(); }).then(function() {
assert.equal(metaCoinEthBalance, 2 * metaCoinBalance, "Library function returned unexpected function, linkage may be broken");
});
});
it("should send coin correctly", function() {
var meta;
// Get initial balances of first and second account.
var account_one = accounts[0];
var account_two = accounts[1];
var account_one_starting_balance;
var account_two_starting_balance;
var account_one_ending_balance;
var account_two_ending_balance;
var amount = 10;
return MetaCoin.deployed().then(function(instance) {
meta = instance;
return meta.getBalance.call(account_one);
}).then(function(balance) {
account_one_starting_balance = balance.toNumber();
return meta.getBalance.call(account_two);
}).then(function(balance) {
account_two_starting_balance = balance.toNumber();
return meta.sendCoin(account_two, amount, {from: account_one});
}).then(function() {
return meta.getBalance.call(account_one);
}).then(function(balance) {
account_one_ending_balance = balance.toNumber();
return meta.getBalance.call(account_two);
}).then(function(balance) {
account_two_ending_balance = balance.toNumber();
assert.equal(account_one_ending_balance,
account_one_starting_balance - amount, "Amount wasn't correctly taken from the sender");
assert.equal(account_two_ending_balance, account_two_starting_balance + amount, "Amount wasn't correctly sent to the receiver");
});
});
});我们来分析一波这个truffle metacoin js版本的单元测试:直接函数contract走起,第一个参数为智能合约名字,第二个参数为匿名内部函数匿名函数传入了当前账户地址,函数体是单元测试集每个单元测试是由关键字it函数来做,第一个参数传入单元测试的comments,第二个参数传入一个无参匿名函数进到无参匿名函数的函数体内,就是正式的单元测试内容,可以定义自己的成员属性,通过调用truffle内部组件自动部署合约逐一测试,使用成员属性接收返回值,最后使用关键字assert来判断是否符合预期。具体业务不详细展开,可根据自己业务内容随意更改。这是官方文档,详细说明如何使用JS来编写智能合约的单元测试。http://truffleframework.com/docs/getting_started/javascript-tests初始化文件解释9:TestMetacoin.sol好下面来看看Solidity智能合约版本的单元测试。一般来讲,这种文件的命名规则是Test加待测智能合约的名字拼串组成。pragma solidity ^0.4.2;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MetaCoin.sol";
contract TestMetacoin {
function testInitialBalanceUsingDeployedContract() public {
MetaCoin meta = MetaCoin(DeployedAddresses.MetaCoin());
uint expected = 10000;
Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially");
}
function testInitialBalanceWithNewMetaCoin() public {
MetaCoin meta = new MetaCoin();
uint expected = 10000;
Assert.equal(meta.getBalance(tx.origin), expected, "Owner should have 10000 MetaCoin initially");
}
}继续分析:首先import了truffle的几个类库,用来支持我们接下来的测试内容。然后import了待测智能合约。建立单元测试智能合约,根据合约不同方法定义对应的test测试方法。方法体内部去调用待测智能合约的方法,传参接收返回值,然后使用关键字assert判断是否符合预期。这是官方文档,详细说明如何使用Solidity来编写智能合约的单元测试。(http://truffleframework.com/docs/getting_started/solidity-tests)2.3 编译合约键入truffle compile输出情况:输出结果根据编译输出的路径地址./build/contracts,我们去查看一下产生文件列表可以看到原来所在在contracts目录下的智能合约文件(有合约contract,有库library)均被编译成了json文件。这些json文件就是truffle用来部署合约的编译文件。2.4 配置以太坊本地环境truffle.js是truffle的配置文件,启动好以太坊本地结点以后,我们需要让truffle去识别它并使用它,这就需要在truffle.js中配置相关属性:module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // Match any network id
}
}
};【说明】如果不启动TestRPC,直接执行部署合约的话,会有以下错误提示:无网络2.5 启动本地以太坊客户端结点启动适合开发的RPC客户端启动之前安装好的EthereumJS RPC客户端。testrpc【说明】一定要启动一个新的客户端执行testrpc命令,可以观察到默认账户和私钥信息。本地客户端2.6 部署合约移植(migrate),对这里叫移植,但下面我们仍使用“部署”这个词,truffle中部署的命令为:truffle migrate输出结果截图如下:部署钱包的输出结果查看testrpc的输出窗口,可以看到这笔交易和花费的区块:2.7 测试合约我们知道在执行编译时会自动执行这些单元测试,如果有一个测试未通过则会中断编译过程。而在开发阶段,我们也可以自己使用命令来测试。truffle test没有报错就说明通过了,绿条“5 passing(2s)”,有报错就会打印在下方。输出截图1输出截图23用Truffle框架运行一个“Hello World!”智能合约3.1 创建工程目录返回父级目录,创建一个文件夹HelloWorld,来做为你的工程根目录。mkdir HelloWorld输入结果:创建并进入该目录3.2 初始化框架在工作目录HelloWorld目录下,执行truffle初始化动作:truffle init输出截图:初始化成功采用SFTP下载文件到本地,可查看目录结构:│ truffle-config.js
│ truffle.js
│
├─contracts
│ Migrations.sol
│
├─migrations
│ 1_initial_migration.js
│
└─test
目录结构简单说明如下:contract/ - Truffle默认的合约文件存放地址。migrations/ - 存放发布脚本文件test/ - 用来测试应用和合约的测试文件truffle.js - Truffle的配置文件3.3 新建新合约在./contract目录下创建一个自己的合约文件Greeter.sol。pragma solidity ^0.4.17;
contract Greeter
{
address creator;
string greeting;
function Greeter(string _greeting) public
{
creator = msg.sender;
greeting = _greeting;
}
function greet() public constant returns (string)
{
return greeting;
}
function setGreeting(string _newgreeting) public
{
greeting = _newgreeting;
}
/**********
Standard kill() function to recover funds
**********/
function kill()public
{
if (msg.sender == creator)
suicide(creator); // kills this contract and sends remaining funds back to creator
}
}
3.4 新建发布脚本在./migrations/目录下新建一个文件:2_deploy_contracts.js,增加发布代码。var Greeter = artifacts.require("./Greeter.sol");
module.exports = function(deployer) {
deployer.deploy(Greeter,"Hello, World!");//"参数在第二个变量携带"
};3.5 编译进入到工程根目录./HelloWorld目录下,进行编译:truffle compile输出截图如下:编译成功截图3.6 启动你的客户端如果之前没有启动RPC客户端的话,则需要启动之前安装好的EthereumJS RPC客户端。如果已启动的则忽略此步。$ testrpc3.7 部署合约(migrate)执行部署命令(truffle migrate)提示出错。truffle migrate错误截图输出:部署失败,提示网络未配置修改文件./HelloWorld/truffle.js文件,增加网络配置:module.exports = {
// See
// to customize your Truffle configuration!
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // 匹配任何network id
}
}
};
重新执行编译命令,重新执行部署命令(truffle migrate),则运行正确。对应Greeter的钱包地址为“0x7d62724f397a99613b84923a1166d683de2db680”部署成功3.8 TRUFFLE测试环境运行合约Truffle提供了一种更加简单的方式,通过交互式控制台来与你的那些准备好的合约进行交互。truffle console一个基本的交互控制台,可以连接任何EVM客户端。如果你已经有了自己的ganache或者geth等EVM的本地环境,那么就可以使用truffle console来交互,所以如果你已经有一个现成的小组共享的开发用EVM,那么使用这个没错。truffle develop一个交互控制台,启动时会自动生成一个开发用区块链环境(其实我认为它与ganache就是一个底层实现机制,都是默认生成10个账户)。如果你没有自己的EVM环境的话,直接使用truffle develop非常方便。truffle console输入Greeter智能合约命令,显示打印出一个json结构,展示了它的各种属性内容。查看Greeter结构根据你的Greeter钱包地址,运行Greeter智能合约命令:hello,world智能合约运行成功3.8 GETH正式环境运行合约启动GETH环境本节假设GETH环境已安装好了。如果还没有安装的同学,可参考文章《第一课 如何在WINDOWS环境下搭建以太坊开发环境》(https://www.jianshu.com/p/683ea7d62a39)的描述步骤。然后在IDE内部打开一个terminal,启动GETH的EVM环境。geth --datadir testNet3 --dev --rpc console截图1截图2GETH 中是通过abi来注册合约对象的。首先我们找到./build/contracts/Greeter.json中的abi的value:"abi": [
{
"inputs": [
{
"name": "_greeting",
"type": "string"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"constant": true,
"inputs": [],
"name": "greet",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newgreeting",
"type": "string"
}
],
"name": "setGreeting",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "kill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
通过json压缩成一行得到:var abi = [{"inputs": [{"name": "_greeting","type": "string"}],"payable": false,"stateMutability": "nonpayable","type": "constructor"},{"constant": true,"inputs": [],"name": "greet","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": false,"inputs": [{"name": "_newgreeting","type": "string"}],"name": "setGreeting","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"constant": false,"inputs": [],"name": "kill","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"}];重新部署智能合约到Geth环境启动一个新的命令窗口,到cd /usr/work/HelloWorldtruffle migrate成功部署输出截图:智能合约部署成功获得Greeter的地址为 0xb52bb3ce336f71a14345c78e5b2f8e63685e3f92切换到GETH环境下,利用api和钱包地址(你自己Greeter智能合约的钱包地址哦)注册合约对象。var abi = [{"inputs": [{"name": "_greeting","type": "string"}],"payable": false,"stateMutability": "nonpayable","type": "constructor"},{"constant": true,"inputs": [],"name": "greet","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": false,"inputs": [{"name": "_newgreeting","type": "string"}],"name": "setGreeting","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"constant": false,"inputs": [],"name": "kill","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"}];var HelloWorld = eth.contract(abi).at('0xb52bb3ce336f71a14345c78e5b2f8e63685e3f92')HelloWorld.greet()输出截图显示成功:4总结及参考本文站在巨人的肩膀上,完成了以太坊开发框架Truffle从入门到实战的演示。对巨人的文章表示感谢:1,Solidity的Truffle框架实战(手把手)(http://truffle.tryblockchain.org/Solidity-truffle-%E5%AE%9E%E6%88%98.html)2, 【精解】开发一个智能合约(http://www.cnblogs.com/Evsward/p/contract.html)3,官网参考:http://truffleframework.com/docs/如需获取源码,请私信作者获取。(点击:“阅读原文”即可查看作者原文)本文来源:简书作者:笔名辉哥以下是我们的社区介绍,欢迎各种合作、交流、学习:)阅读原文编辑于 2018-06-25 11:16科技区块链(Blockchain)赞同 232 条评论分享喜欢收藏申请转载文章被以下专栏收录HiBlock区块链社区HiBlock区块
TRUFFLE中文(简体)翻译:剑桥词典
TRUFFLE中文(简体)翻译:剑桥词典
词典
翻译
语法
同义词词典
+Plus
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录
/
注册
中文 (简体)
查找
查找
英语-中文(简体)
truffle 在英语-中文(简体)词典中的翻译
trufflenoun [ C ] uk
Your browser doesn't support HTML5 audio
/ˈtrʌf.əl/ us
Your browser doesn't support HTML5 audio
/ˈtrʌf.əl/
truffle noun [C]
(RARE FOOD)
Add to word list
Add to word list
a type of fungus that grows underground and can be eaten. Truffles are expensive because they are very rare.
块菌,松露(食用菌,生于地下,因稀有而昂贵)
The Dordogne region's gastronomic specialities include truffles and foie gras.
多尔多涅地区的美食特产包括块菌和肥鹅肝。
Use truffle oil to add flavour to the dish.
给菜里加点松露油增加一点滋味。
truffle noun [C]
(CHOCOLATE)
a small, round, very soft chocolate
巧克力软糖
rum truffles
朗姆酒巧克力
(truffle在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)
truffle的例句
truffle
In these areas, the search for black truffles and their cultivation is a tradition going back more than 200 years.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
The aromas of the wine include red fruits, berries and spices, as well as truffles for older wines.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
Likes truffle and elegance, and deeply hates vulgarity.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
As with the true truffles, some of them have distinctive smells and are actively hunted out by small mammals which may consume them and spread their spores.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
Rodents and insectivores, whose food stashes were destroyed in the fire, eat truffles, which survived underground, and leave feces containing nitrogen-fixing bacteria in the soil.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
The top layer is soft raspberry jelly, the middle layer is truffle, and the bottom one is marzipan.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
The filling can also be similar to a truffle or a cherry cordial, with bourbon added.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
Options include a tiger prawn and watercress salad, and roast beef with truffle with a green bean salad.
来自 Wikipedia
该例句来自维基百科,在CC BY-SA许可下可重复使用。
示例中的观点不代表剑桥词典编辑、剑桥大学出版社和其许可证颁发者的观点。
B1
truffle的翻译
中文(繁体)
稀有食品, 塊菌(食用菌,生於地下,因稀有而昂貴), 巧克力…
查看更多内容
西班牙语
trufa, Trufa…
查看更多内容
葡萄牙语
trufa…
查看更多内容
更多语言
土耳其语
法语
in Dutch
捷克语
丹麦语
印尼语
泰语
越南语
波兰语
in Swedish
马来语
德语
挪威语
in Ukrainian
俄语
çikolatalı yumuşak tatlı, bir tür mantar, bir mantar tipi…
查看更多内容
truffe…
查看更多内容
truffel…
查看更多内容
lanýž (houba), lanýž (bonbon)…
查看更多内容
trøffel, chokoladetrøffel…
查看更多内容
jenis jamur, permen cokelat beralkohol…
查看更多内容
เห็ดทรัฟเฟิล, ช็อคโกแลตทรัฟเฟิล…
查看更多内容
nấm cục, sôcôla truffle…
查看更多内容
trufla, trufel…
查看更多内容
tryffel…
查看更多内容
trufel…
查看更多内容
der Trüffel…
查看更多内容
trøffel, trøffelsjokolade…
查看更多内容
трюфель…
查看更多内容
трюфель (конфета), трюфель (гриб)…
查看更多内容
需要一个翻译器吗?
获得快速、免费的翻译!
翻译器工具
truffle的发音是什么?
在英语词典中查看 truffle 的释义
浏览
true to life
true-blue
true-life
true-life story
truffle
trug
truism
truly
trump
“每日一词”
veggie burger
UK
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɜː.ɡər/
US
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɝː.ɡɚ/
a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape
关于这个
博客
Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)
March 06, 2024
查看更多
新词
stochastic parrot
March 04, 2024
查看更多
已添加至 list
回到页面顶端
内容
英语-中文(简体)例句翻译
©剑桥大学出版社与评估2024
学习
学习
学习
新词
帮助
纸质书出版
Word of the Year 2021
Word of the Year 2022
Word of the Year 2023
开发
开发
开发
词典API
双击查看
搜索Widgets
执照数据
关于
关于
关于
无障碍阅读
剑桥英语教学
剑桥大学出版社与评估
授权管理
Cookies与隐私保护
语料库
使用条款
京ICP备14002226号-2
©剑桥大学出版社与评估2024
剑桥词典+Plus
我的主页
+Plus 帮助
退出
词典
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
翻译
语法
同义词词典
Pronunciation
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录 /
注册
中文 (简体)
Change
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
中文 (简体)
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
关注我们
选择一本词典
最近的词和建议
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
语法与同义词词典
对自然书面和口头英语用法的解释
英语语法
同义词词典
Pronunciation
British and American pronunciations with audio
English Pronunciation
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
词典+Plus
词汇表
选择语言
中文 (简体)
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
内容
英语-中文(简体)
Noun
truffle (RARE FOOD)
truffle (CHOCOLATE)
例句
Translations
语法
所有翻译
我的词汇表
把truffle添加到下面的一个词汇表中,或者创建一个新词汇表。
更多词汇表
前往词汇表
对该例句有想法吗?
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
松露_百度百科
度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心松露播报讨论上传视频一种蕈类的总称收藏查看我的收藏0有用+10松露(学名:Truffle)是一种蕈类的总称,分类为子囊菌门西洋松露科西洋松露属(学名:Tuber)。大约有10种不同的品种,通常是一年生的真菌,多数在阔叶树的根部着丝生长,一般生长在松树、栎树、橡树下。散布于树底方圆120~150厘米,块状主体藏于地下3~40厘米。分布在意大利、法国、西班牙、中国、新西兰等国。松露食用气味特殊,含有丰富的蛋白质、氨基酸等营养物质。松露对生长环境的要求极其苛刻,且无法人工培育,产量稀少,导致了它的珍稀昂贵。因此欧洲人将松露与鱼子酱、鹅肝并列“世界三大珍肴”。在众多种类中,法国产的黑松露(Tuber melanosporum Vitt.)与意大利产的白松露(Tuber magnatum Pico)评价最高。白松露一般生食,磨碎后撒在意大利面或煎蛋上。可以切成薄片加在肉里一同烤制,或用来烤鹅肝。有些奶酪中也添加了松露。黑松露的味道没有白松露那么浓烈,可以做松露盐或松露蜂蜜。过去松露要去皮,现在多采用研磨避免浪费。2016年4月,澳大利亚发现世界最大松露,重达1.5公斤。中文名松露外文名Truffle别 名地菌、块菌、块菰,猪拱菌界真菌界门子囊菌门亚 门盘菌亚门纲盘菌纲亚 纲盘菌亚纲目盘菌目科西洋松露科族菌类属西洋松露属种松露亚 种块茎分布区域意大利、法国、西班牙等国荣 誉被欧洲人称为“餐桌上的钻石”俄文名трю́фель目录1形态特征2生长习性3地理分布▪意大利▪法国▪中国4品种分类▪意大利白松露▪黑冬松露▪黑夏松露▪俄勒冈白松露5采集方法6食用价值7食用方法8历史渊源▪公元前3000年▪中世纪时期▪17世纪前▪17-20世纪9中国渊源10相关新闻11食物营养成分形态特征播报编辑松露图册一(10张)松露子实体如块状,小者如核桃,大者如拳头。幼时内部白色,质地均匀,成熟后变成深黑色,具有色泽较浅的大理石状纹理。子囊果球形、椭圆形,棕色或褐色,有的小如豆,也有大如富士苹果,表面具有多角形疣状物,反射出红色的光泽,顶端有凹陷;其肉(产孢子组织)初为白色,后呈棕色或灰色,成熟时会变为黑色;切面呈褐色,具有大理石样纹,散发出森林般潮湿气味,并带有干果香气,借以引诱小动物前来觅物,将孢子带到他处进行繁殖。松露外形奇特可以小如花生,也可能大如手球。松露生长周期只有一年。它的大小和年龄完全无关。只伴随着四季变化而成长,死亡与诞生。一般的,黑松露大约12月就进入成熟期直到隔年3月。过熟的松露就会腐烂解体。生长习性播报编辑松露松露生长在土里,是一种附着于松树根下的茎块菌类,含大量水分和钾﹑钙﹑镁﹑铁﹑氟等微量矿物元素。它不像一般的菌菇柔软多汁,反而质地较坚硬。松露偏好碱性土质,高品质的松露主要出产于石灰质地形区内,如意大利的阿尔巴、法国的佩里哥、中国的云南永仁县等,全都位在石灰质地形区内。松露的养分来自附着的树根和土壤,一个地方如果生长过松露,土地和植物的养分会被松露吸收殆尽,在一段时间内无法生长出其他东西。松露在成长过程中也受不了任何细微的环境变动,它对环境的挑剔着实令人咋舌。它是世界上为数不多不能进行有序人工种植的美味之一,必须借助和树根之间的共生关系获取养分。只要周边生存的环境发生了细微的变化,松露孢子将无法生长。但21世纪初西方国家已实现了半人工生长。松露特别喜欢在松树、橡树、白杨树、柳树、榛树和椴树下生长,颜色和气味因树种而不同。如今机械化农耕方式、土壤受到农药喷洒、雨量过剩或过少、森林树种变化等,也是松露在二十世纪大量减产的主因。地理分布播报编辑意大利松露图片(5张)白松露,只在意大利和巴尔干半岛的克罗地亚发现过白松露。色泽为轻微的金色,浅褐色(米色)或者是淡棕色,并且带有棕褐色或者乳白色的斑块或者细小的纹理。大小不等,小的有高尔夫球那么大,大的就好似苹果了。在好的年份,白松露的世界产量也只有3吨,相对于年产量约35吨的黑松露,可想而知其珍贵程度。 [1]皮埃蒙特 意大利西北部的皮埃蒙特大区(Piemonte)位于波河上游谷地,西、北为阿尔卑斯山脉环绕,南是利古里亚亚平宁山脉。这一区域的古内奥省(cuneo)阿尔巴(Alba:皮埃蒙特中南部,包括朗格Langhe丘陵和罗艾洛Roero地区)出产白松露。法国普罗旺斯黑松露普罗旺斯是全球最重要的黑松露产地,产量占法国的90%。最主要的生产中心集中在北部的Tricastin,每年有上30吨左右的产量。萨尔拉始建于公元9世纪,距今有1000多年的历史。被誉为“美食的天堂”。盛产黑松露、鹅肝,法国著名的鹅肝酱制造商几乎都集中在此处。萨尔拉菜肴在法国西南菜系中确有一席之地。黑松露,主要出产于法国南部。色泽介于深棕色与黑色之间。黑松露外表崎岖不平,呈小凸起状。中国中国也有产松露,外形和法国黑松露非常相像。外皮的鳞片比较小。内部的白色条纹比较细密。主要长在松树的须根。这也是“松露”中文名的由来。主要产地在云南永仁、四川攀枝花一带。成熟的中国黑松露带有复杂的菌菇味道,是一种让人无法理解的嗅觉味道。根据最新的报道,我国台湾省高海拔的山区也有少量松露成长,外形与法国/大陆的非常相近,属于近亲种源。但亚洲人普遍对这一美食没有太多的接触与了解,所以没有进行商业化运作。20世纪末,中国科学家在喜玛拉雅山脉的东南地区发现了黑松露的分布。实际上,在中国西南的藏族、四川攀枝花、云南永仁县的彝族等少数民族地区,松露被当地人们称作“无娘果”。中国松露主要出产 [2]在金沙江流域,现已发现黑松露、白松露等多个松露品种,是金沙江特产之一。以云南永仁县、四川攀枝花为中心方圆200公里范围内是中国松露主要产区。品种分类播报编辑意大利白松露常用名:意大利白松露或艾尔巴松露学名:Tubermagnatum原产地:意大利,克罗地亚生长季节:每年10月到12月味道:与众不同。略微带蒜味,有些类似奶酪,带一些刺鼻的味道。食法:通常生食,切成薄片后与鸡蛋,意大利通心粉,宽面条或沙拉同食。黑冬松露常用名:黑冬松露或佩里戈尔松露Tubermelanosporum学名:Tubermelanosporum原产地:主要为法国,也出产于西班牙与意大利、中国云南永仁县。生长季节:每年12月到次年3月味道:蕴含泥土的芳香,丰润。食法:通常加热食用,用来给鸡蛋或者米饭调味,用于烤鸡的皮下或奶油调料中。黑夏松露常用名:黑夏松露学名:Tuberaestivum原产地:法国、意大利、西班牙、中国云南永仁生长季节:5月到9月味道:比黑冬松露的味道要淡,更接近于平常的蘑。食法:生吃或稍微加热以达到最好的效果。大块的食用,与意大利通心粉、肉类或者调味酱同用。俄勒冈白松露Tuber gibbosum常用名:俄勒冈白松露学名:Tubergibbosum原产地:美国西北部生长季节:每年10月到11月味道:与欧洲的松露不同,味道更淡,更脆更多。食法:生吃。或者调于黄油、橄榄油、调味酱或者高汤中。采集方法播报编辑黑松露黑松露的成熟期通常在每年的11月到次年的三月,通常最好的季节是在12月到次年的3月之间。采集松露的人叫做“松露猎人”,每个松露猎人身上都有一本家传的藏宝图,记录着父辈们曾经找到松露的地点、时间和大小。寻找松露的过程十分有趣,各国猎人使用的方法也不尽相同。在法国,人们习惯把母猪当作收获黑松露的得力助手。母猪的嗅觉极其灵敏,在6米远的地方就能闻到埋在25厘米至30厘米深的地下的松露。这是因为松露的气味与诱发母猪性冲动的雄甾烯醇类似, [3]所以母猪对其情有独钟。但是母猪有贪吃松露的毛病,如果猎人没有及时拦住,母猪找到松露时会疯狂地将它拱出来吃掉。在意大利,人们更喜欢用经过训练的雌性猎犬来寻找白松露。通常,猎犬会用它的爪子在松露所在的位置上做个记号,等主人来后用小耙子小心翼翼地从土壤中将珍贵的松露挖出来。训练一只会寻找松露的猎犬要经过复杂的过程,首先是训练狗把丢出去的球叼回来,然后用奶酪代替球,继而把奶酪藏起来让狗去把它找出来,最后再用小块松露代替奶酪,让狗找到并挖出来。这样一条经过训练的猎犬,在市场上可以卖到3000欧元。在寻找松露的前一夜,猎人通常不给猎犬吃东西,这样猎犬为了换取食物作为奖励,会更加努力地去寻找松露。食用价值播报编辑科学研究数据显示黑松露含有丰富的蛋白质、18种氨基酸(包括人体不能合成的8种必需氨基酸)、不饱和脂肪酸、多种维生素、锌、锰、铁、钙、磷、硒等必需微量元素,以及鞘脂类、脑苷脂、神经酰胺、三萜、雄性酮、腺苷、松露酸、甾醇、松露多糖、松露多肽等大量的代谢产物,具有极高的营养保健价值。其中雄性酮有助阳、调理内分泌的显著功效;鞘脂类化合物在防止老年痴呆、动脉粥样硬化以及抗肿瘤细胞毒性方面有明显活性;多糖、多肽、三萜具有增强免疫力、抗衰老、抗疲劳等作用,可用于保健养身。食用方法播报编辑块菌炖鸡一、 原料:块菌干品50克、母鸡一只(约1500克)、葱、姜片、精盐、味精、胡椒粉二、 作法:1、 将块菌干品用温水浸泡发胀、洗净。2、 将宰杀洗净后的鸡放入锅内,加入水约3斤,放入葱(打结)、姜片武火烧至沸腾,加入块菌,盖严锅口,烧沸后移文火烧约3小时,加入精盐、味精即可。历史渊源播报编辑公元前3000年松露最早出在新苏美尔的铭文,铭文上记载了亚摩利人的饮食习惯,说他们常常吃松露。几个世纪后,泰奥弗拉斯在他的笔札上又提及松露。公元前3000年,巴比伦人已经在海滩和沙漠寻找松露。古希腊故事提及阿佛洛狄忒(爱情女神)特别爱吃这个蘑菇(菲罗玄的莱夫卡斯率先在笔札中谈及松露具有春药的效力)。一个传说认为松露是被宙斯的雷引发的。在古代,意大利有两种松露:Tuber Melanosporum(冬季黑松露,黑孢块菌)与Tuber Magnatum Pico(白松露 , 白块菌)。尽管如此,罗马人只食用铁飞兹,一种形似松露的蘑菇。铁飞兹被称为“沙漠松露”。它产自莱斯沃斯岛,迦太基,尤其是利比亚。因为在古时候那些地方的沿海气候要比现今潮湿。中世纪时期中世纪时期,农民使用松露来调味。意大利的萨沃亚家族特别喜欢松露,阿卡加王子给波旁王朝的礼物中常常有松露。教皇从罗马迁居到阿维尼翁后发现了松露并且爱上了它们,每个星期都吃。巴特鲁姆普拉提纳教皇的历史家1481年时记载了寻找松露的事情,他写道:“有一种母猪特别擅长寻找松露,可是人们应该让它们戴上口套,以避免它们将松露吃个精光!”17世纪前文艺复兴时期,松露在欧洲重新流行,它们在法国国王弗朗西斯一世的城堡里天天出现。尽管如此,松露真正的盛行是从17世纪开始的。那时的欧洲人(特别是法国人)放弃重口味的东方香料,重新发现天然食品的价值。十七世纪八十年代松露在巴黎市场是非常受欢迎的美食,法国人全年从松露产区进口各种各样的松露。布里亚萨-萨瓦林说了:“松露是如此之贵,以至于它们只出在贵族的餐桌上用以吸引女性。”17-20世纪1711年,法国植物学家艾蒂安弗朗索瓦若弗鲁瓦第一次将松露定义为一种蘑菇。1729年,佛罗伦萨来的乔瓦尼贝尔纳多维哥准确地定义两种黑松露:黑孢块菌(Tuber Melanosporum)与夏块菌(Tuber Aestivum)。1780年,波兰的让米歇尔博尔奇在他的“关于皮埃蒙特松露的家书”里准确的描述了皮埃蒙特松露的外形和口感。20世纪,意大利的白松露在世界上越来越有名。第二次世界大战后,蒙费拉托,罗埃罗,瓦利库罗内,格吕埃等地区的人们都在积极地收集白松露。现今,松露在很多国内国际博览会有很重要的地位。 [4]中国渊源播报编辑公元664年4月,朝里若、朝拉若从月利巴拉来到直苴腹地泥泽薄打猎,跟踪野猪的时候发现野猪从树根拱出颜色漆黑的球状物哼哼唧唧的吃着,野猪跑了,他们太饿,不得不刨挖野猪拱过地方的东西吃。吃了之后发现这漆黑的球状物不仅能填饱肚子还能增强体力、提高性能力。从此,朝里若、朝拉若把这种不明生物称为猪拱菌,每年直苴彝族赛装节前带领族人采挖猪拱菌,用于接待参加赛装节的尊贵客人,吃猪拱菌这一习俗一直延续到现代。随着外来文化的影响,直到1995年人们才弄明白:猪拱菌也叫松露、块菌,英文truffle,居然是世界上最名贵的食用菌。 [5]相关新闻播报编辑2010年11月,“赌王”何鸿燊以破纪录33万美金,即约港币250多万元,标下两颗共重1.3公斤的意大利托斯拉纳白松露菌和莫利塞白松露菌。这是澳博连续第四年在澳门新葡京酒店举办意大利白松露菌国际慈善拍卖晚宴。 [6]2015年9月20日,黑松露(黑松露野蘑菇汤)荣登美国国宴大雅之堂! [7]2015年10月21日,黑松露(松露酱)荣登英国国宴大雅之堂! [8]2016年8月,澳大利亚发现世界最大松露,该松露为黑松露,重达1.5千克,价值约3000美元。 [9]食物营养成分播报编辑食物名称松露含量参考约每100克食物中的含量能量487 千卡蛋白质4.5 g脂肪34.6 g胆固醇27 mg饱和脂肪酸22.5 g多不饱和脂肪酸1 g单不饱和脂肪酸8.5 g水分16 g碳水化合物41.1 g糖34.3 g膳食纤维2.4 g叶酸11 μg钠46 mg镁85 mg磷156 mg钾362 mg钙50 mg铁3 mg锌1.44 mg碘3.8 μg维生素A139 μg维生素B1(硫胺素)0.04 mg维生素B2(核黄素)0.13 mg烟酸(烟酰胺)1.74 mg维生素D0.1 μg维生素E0.46 mg展开新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000Truffle 配置 | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
Truffle 配置 | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
深入浅出区块链
Truffle 中文文档
v5.0.0
快速入门 Truffle
创建项目工程
项目结构
使用测试
编译合约
使用 Truffle Develop 部署合约
可选: 通过 Ganache 部署
合约交互
进一步学习
基本功能
安装 Truffle
环境依赖
Windows 用户需了解
创建 Truffle 项目工程
编译合约
合约文件目录
编译命令
构建工件 Artifacts
引入合约依赖文件
通过文件名导入依赖文件
从外部包导入合约
合约部署(Migrations)
部署命令
脚本文件
artifacts.require()
module.exports
初始化迁移功能
部署程序 Deployer
考虑网络
可用账号
部署程序接口 Deployer API
deployer.deploy(contract, args…, options)
deployer.link(library, destinations)
deployer.then(function() {…})
与合约进行交互
介绍
数据的读和写
交易 Transactions
调用 Calls
什么是合约抽象
执行合约函数
执行交易Transactions
执行调用 call
处理交易结果
捕获事件 events
部署新合约
指定合约地址
给合约发送以太
延伸阅读
Truffle 和 MetaMask 配合
MetaMask 是什么?
安装 MetaMask
MetaMask 和 Ganache 搭配使用
探测 MetaMask 注入的 web3
MetaMask 设置
搭配 Truffle Develop 使用 MetaMask
搭配 Ganache CLI 使用 MetaMask
用 EthPM 进行包管理
安装软件包
安装依赖
使用安装的合约
发布自己的软件包
Ropsten, Ropsten, Ropsten
包配置
命令
在发布之前
用 NPM 进行包管理
包文件布局
使用包
安装
在合约代码中使用包
在JavaScript中使用包
包的部署地址
发布之前
调试合约
概述
调试命令
调试器界面
(o) 跳过(step over)
(i) 进入(step into)
(u) 跳出(step out)
(n) 下一步(step next)
(;) 单步指令(step instruction)
(p) 打印指令(print instruction)
(h) print this help
(q) 退出
(r) 重置(reset)
(b) 设置断点(set a breakpoint)
(B) 移除断点(大写的B)
(c) 跳到下一个断点
(+) 添加一个监视表达式
(-) 移除监视表达式
(?) 列出所有的监视表达式及断点
(v) 显示变量
(T) 卸载交易
(t) 加载交易
添加和移除断点
使用控制台
为什么有两个控制台?
命令
登录控制台
登录Develop控制台
配置 Truffle Develop
功能
可用命令
编写外部脚本
命令
文件结构
第三方插件命令
Plugin installation / usage
Creating a custom command plugin
支持 Quorum 开发
已知问题
配置
Using Privacy Features
编写测试用例
测试合约
测试框架
测试用例目录
测试合约命令
”干净的“ 测试环境
速度和可靠性考虑
用 JavaScript 写测试用例
Use contract() instead of describe()
Use contract abstractions within your tests
Using artifacts.require()
Using web3
Examples
Using .then
Using async/await
Specifying tests
Advanced
TypeScript File Support
用 Solidity 写测试用例
Example
Test structure
Assertions
Deployed addresses
Test contract names
Test function names
before / after hooks
Advanced features
Testing for exceptions
Testing ether transactions
高级用法
选择网络及部署
配置
指定网络
Build artifacts
应用部署
构建过程
运行外部命令
Providing a custom function
Creating a custom module
Bootstrapping your application
创建 Truffle Box
创建 box
配置文件
ignore (array)
commands (object)
hooks (object)
图片
Truffle site listing
参考引用
选择以太坊客户端
开发过程中
Ganache
Truffle Develop
Ganache CLI
部署到线上网络
部署到私有网络
Truffle 配置
配置文件位置
解决 Windows 命令名冲突
常用配置选项
网络 networks
提供者 Providers
指定合约目录
指定合约构建生成目录
迁移文件目录
mocha
指定编译器
solc
使用外部编译器
插件 plugins
EthPM 配置
包名:package_name
版本:version
描述:description
作者 authors
关键字 keywords
依赖 dependencies
许可协议 license
合约抽象封装
使用方法
API
Contract Abstraction API
MyContract.new([arg1, arg2, ...], [tx params])
MyContract.at(address)
MyContract.deployed()
MyContract.link(instance)
MyContract.link(name, address)
MyContract.link(object)
MyContract.networks()
MyContract.setProvider(provider)
MyContract.setNetwork(network_id)
MyContract.hasNetwork(network_id)
MyContract.defaults([new_defaults])
MyContract.clone(network_id)
MyContract.numberFormat = number_type
MyContract.timeout(block_timeout)
MyContract.autoGas =
MyContract.gasMultiplier(gas_multiplier)
Contract Instance API
Making a transaction via a contract function
Explicitly making a call instead of a transaction
Calling getters
Processing transaction results
Sending Ether / Triggering the fallback function
Estimating gas usage
Truffle 命令手册
使用方法
命令列表
构建 build
编译合约 compile
config
启动控制台 console
创建 create
调试 debug
部署 deploy
控制台 develop
exec
帮助 help
初始化工程 init
安装 install
migrate
网络 networks
操作码 opcode
发布 publish
运行 run
测试 test
解包 unbox
查看版本 version
监视变化 watch
联系开发者
Gitter
Issue Tracker
相关文档
Solidity 中文文档
Web3.js 中文文档
Truffle 中文文档
Docs »
Truffle 配置
Edit on GitHub
Truffle 配置¶
配置文件位置¶
配置文件名为 truffle-config.js ,位于项目目录的根目录下。 它是Javascript文件,可以执行创建配置所需的任何代码。 它必须导出表示项目配置的对象,如下例所示:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // 匹配任何网络
}
}
};
默认配置附带开发网络的配置,运行在 127.0.0.1:8545 上。 还有许多其他配置选项,详情如下。
解决 Windows 命令名冲突¶
警告
仅适用于Truffle 4 及以下版本。
在Windows上使用命令提示符时,默认配置文件名可能会导致与 truffle 可执行文件冲突,因此我们可能无法在现有项目上正确运行Truffle命令。
这是因为命令优先级在命令提示符上的工作方式。 truffle.cmd 可执行文件作为 npm 包的路径上,但 truffle.js 配置文件位于运行 truffle 命令的实际目录中。 而 .js 是默认的可接受的可执行扩展名,truffle.js 优先于 truffle.cmd ,导致意外的结果。
以下任何解决方案都可以解决此问题:
使用 .cmd 扩展名( truffle.cmd compile )显式调用可执行文件。
编辑系统 PATHEXT 环境变量并从可执行扩展列表中删除 .JS; 。
将 truffle.js 重命名为其他东西(truffle-config.js)。
使用 Windows PowerShell 或 Git BASH, 或不会引起冲突的 shell .
常用配置选项¶
网络 networks¶
指定部署网络,以及与每个网络交互时的特定交易参数(例如,gas价格,账号地址等)。 在指定网络上进行编译和部署时,将保存并记录合约工件(artifacts)以供以后使用。
当合约抽象检测到我们的以太坊客户端连接到指定网络时,他们将使用与该网络相关联的合约工件(artifacts)来简化应用程序部署。 网络是通过以太坊的 net_version RPC调用以及区块链URI来识别。
如下所示,networks 对象由网络名称作为键,并包含定义相应网络参数的对象。
networks 选项是必须项,如果没有网络配置,Truffle将无法部署我们的合约。 truffle init 提供的默认网络配置为我们提供了一个与其连接相匹配的开发网络 - 开发过程中非常有用,但不适合生产部署。
要将Truffle配置连接到其他网络,就需添加更多命名网络(named networks)并指定相应的网络ID。
网络名称可用于提示用户,例如它特定网络上运行迁移:
$ truffle migrate --network live
如:
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*", // 匹配任何网络
websockets: true
},
live: {
host: "178.25.19.88", // 用于示例目的的随机IP(不要使用)
port: 80,
network_id: 1, // 以太坊主网
// 可选配置:
// gas
// gasPrice
// from - Truffle 在进行交易是的默认发送地址
// provider - Truffle 用来连接以太坊网络的 web3 provider 实例
// - 如果是一个函数,需要返回 web3 provider 实例 (参考下文)
// - 如果指定了provider, host 和 port 或忽略。
// skipDryRun: - 如果不想在实际迁移之前在本地测试运行迁移,则为true(默认为false)
// timeoutBlocks: - 如果没有交易没有挖出,保持等待的区块数(默认为50)
}
}
不管哪个网络,如果未指定交易选项,则将使用以下默认值:
gas: 指定部署的 gas limit。 默认为 4712388。
gasPrice: 指定部署的 gas价格。 默认为 100000000000(100香农)。
from: 部署时使用的账号地址。 默认为我们的以太坊客户端提供的第一个可用帐户。
provider: 默认web3提供者使用 host 和 port 指定,如 new Web3.providers.HttpProvider("http://
websockets: 我们需要启用此功能才能使用 confirmmations 监听器或使用 .on 或 .once 监听事件。 默认为 false 。
对于每个网络,我们可以指定 host / port 或 provider ,但不能同时指定两者。 如果我们需要 HTTP 提供者(Provider),我们建议使用 host 和 port ,而如果我们需要自定义提供者(Provider),如HDWalletProvider,则必须使用 provider 。
提供者 Providers¶
以下网络列表由本地测试网络和 Infura 托管的 Ropsten 网络组成,两者均由 HDWalletProvider 提供。 确保在函数闭包中包装(wrap) truffle-hdwallet 提供者(Provider),如下所示,以确保一次只连接一个网络。
networks: {
ropsten: {
provider: function() {
return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/YOUR-PROJECT-ID");
},
network_id: '3',
},
test: {
provider: function() {
return new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/");
},
network_id: '*',
},
}
如果指定 host 和 port 而不是 provider ,Truffle将使用该主机和端口创建自己的默认 HTTP 提供者(Provider),在这种情况下,我们将无法使用自定义提供者(Provider)。
指定合约目录¶
默认(未编译合约)目录的是位于项目根目录的 ./contacts 。 如果我们希望将合约保存在不同的目录中,则可以指定 contracts_directory 属性。
例如,让Truffle在编译时在 ./allMyStuff/someStuff/theContractFolder(递归)文件中查找合约:
module.exports = {
contracts_directory: "./allMyStuff/someStuff/theContractFolder",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
注解
除了指定相对路径外,还可以使用 globs/regular 表达式来有选择地编译合约。
指定合约构建生成目录¶
编译合约的默认输出目录是相对于项目根目录的 ./build/contracts 。 这可以使用 contracts_build_directory 属性进行更改。
例如,将构建的合约工件(artifacts)放在 ./output/contracts 中:
module.exports = {
contracts_build_directory: "./output",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
构建的合约工件(artifacts)不需要位于项目根目录中:
module.exports = {
contracts_build_directory: "../../../output",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
绝对路径也可以,但是不建议这样做,因为在另一个系统上编译时可能不存在绝对路径。 如果在Windows上使用绝对路径,请确保对路径使用双反斜杠(例如:C:\\Users\\Username\\output)。
迁移文件目录¶
默认迁移目录是项目根目录下的 ./migrations 文件夹。 可以使用 migrations_directory 更改此设置。
如:
module.exports = {
migrations_directory: "./allMyStuff/someStuff/theMigrationsFolder",
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
}
}
};
mocha¶
MochaJS 测试框架的配置选项。 此配置需要一个对象,详见Mocha的文档。
例如:
mocha: {
useColors: true
}
指定编译器¶
在 compilers 对象中,我们可以指定与Truffle使用的编译器相关的设置。
solc¶
Solidity编译器设置, 支持 solc 的优化器(optimizer)设置。
可以指定…
solc-bin 上列出的所有的 solc-js 版本,需要的话,可以指定一个,Truffle 会自动获取它。
一个原生编译的 solc (需要自己安装,下面的链接帮助)。
这里有发布的docker竞相的(dockerized )solc 。
本地可用的 solc 路径
Truffle 配置示例:
module.exports = {
compilers: {
solc: {
version:
// 也可以指定为 "native" ,表示使用 native solc
docker:
settings: {
optimizer: {
enabled:
runs:
}
evmVersion:
}
}
}
}
有关详细信息,请参阅Solidity文档 - 编译器输入输出JSON描述.
使用外部编译器¶
如果要使用创建工件的更高级用法,可以使用外部编译器配置。
可以通过在Truffle配置中添加 compilers.external 对象来使用此功能:
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
/* 编译输出 */
}]
}
}
}
当我们运行 truffle compile 时,Truffle 将运行已配置的命令并查找 targets 指定的合约工件(artifacts)。
这个配置支持的几个主要用例:
编译命令可直接输出 Truffle JSON 工件(artifacts)。
如果编译命令能直接生成工件(artifacts),或生成包含工件的所有信息的输出,请按如下方式配置目标(target):
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
path: "./path/to/artifacts/*.json"
}]
}
}
}
Truffle 将执行我们的脚本,然后展开glob(*)并查找列出的路径中的所有.json文件,并将它们作为工件复制到 build/contracts/ 目录中。
编译命令输出工件的各个部分,我们希望Truffle 生成工件(artifacts)。
上述用例可能不适用于所有用例。 我们可以将 target 配置为运行“后处理命令”,如:
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
path: "./path/to/preprocessed-artifacts/*.json",
command: "./process-artifact"
}]
}
}
}
这将为每个匹配的 .json 文件运行 ./process-artifact ,该文件的内容作为 stdin 管道传输。 然后 ./process-artifact 命令(期望)输出一个完整的 Truffle 工件(artifact)作为 stdout。
如果想要提供路径代替文件名? 在 taget 配置中添加 stdin: false。
我们还可以指定合约的各个属性,并让 Truffle 自己生成工件 (artifacts)。
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
targets: [{
properties: {
contractName: "MyContract",
/* other literal properties */
},
fileProperties: {
abi: "./output/contract.abi",
bytecode: "./output/contract.bytecode",
/* other properties encoded in output files */
}
}]
}
}
}
指定 properties 和/或 fileProperties ,Truffle 将在构建工件时查找这些值。
要覆盖所有指定路径和运行命令的工作目录,请使用 workingDirectory 选项。
例如,以下将运行 ./proj/compile-contracts 并读取 ./proj/output/contract.abi :
module.exports = {
compilers: {
external: {
command: "./compile-contracts",
workingDirectory: "./proj",
targets: [{
fileProperties: {
abi: "./output/contract.abi",
bytecode: "./output/contract.bytecode",
}
}]
}
}
}
插件 plugins¶
注解
仍处于”准系统状态”的新功能,同时还可向 Truffle 反馈改进意见!
为Truffle提供通过 NPM 安装(通过 dependencies 安装的)的第三方扩展的列表。
Truffle 插件目前仅支持自定义工作流命令的插件。 有关更多信息,请参阅第三方插件命令-编写脚本。
EthPM 配置¶
此配置是可选的,配置文件为 ethpm.json 和 truffle.js 在同一目录下。
包名:package_name¶
我们要发布的包的名称,包名称不能和已有 EthPM 注册表的包名相同(确保 unique)。
举例:
package_name: "adder"
版本:version¶
该软件包的版本,使用[semver](http://semver.org/)规范。
举例:
version: "0.0.3"
描述:description¶
人类可读的文字说明。
举例:
description: "Simple contract to add two numbers"
作者 authors¶
作者列表,可以有任何格式,但我们建议采用以下格式。
举例:
authors: [
"Tim Coulter
]
关键字 keywords¶
关键字列表,使用有用的类别标记此包。
举例:
keywords: [
"ethereum",
"addition"
],
依赖 dependencies¶
版本范围使用semver规范,列出软件包所依赖的EthPM软件包。
举例:
dependencies: {
"owned": "^0.0.1",
"erc20-token": "1.0.0"
}
许可协议 license¶
用于此程序包的许可证,严格提供。
举例:
license: "MIT",
Next
Previous
© Copyright 2019, 深入浅出区块链
最后更新于 2019/05/21.
Built with Sphinx using a theme provided by Read the Docs.
Truffle 命令手册 | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
Truffle 命令手册 | Truffle 中文文档 - DApp 开发框架 | 深入浅出区块链
深入浅出区块链
Truffle 中文文档
v5.0.0
快速入门 Truffle
创建项目工程
项目结构
使用测试
编译合约
使用 Truffle Develop 部署合约
可选: 通过 Ganache 部署
合约交互
进一步学习
基本功能
安装 Truffle
环境依赖
Windows 用户需了解
创建 Truffle 项目工程
编译合约
合约文件目录
编译命令
构建工件 Artifacts
引入合约依赖文件
通过文件名导入依赖文件
从外部包导入合约
合约部署(Migrations)
部署命令
脚本文件
artifacts.require()
module.exports
初始化迁移功能
部署程序 Deployer
考虑网络
可用账号
部署程序接口 Deployer API
deployer.deploy(contract, args…, options)
deployer.link(library, destinations)
deployer.then(function() {…})
与合约进行交互
介绍
数据的读和写
交易 Transactions
调用 Calls
什么是合约抽象
执行合约函数
执行交易Transactions
执行调用 call
处理交易结果
捕获事件 events
部署新合约
指定合约地址
给合约发送以太
延伸阅读
Truffle 和 MetaMask 配合
MetaMask 是什么?
安装 MetaMask
MetaMask 和 Ganache 搭配使用
探测 MetaMask 注入的 web3
MetaMask 设置
搭配 Truffle Develop 使用 MetaMask
搭配 Ganache CLI 使用 MetaMask
用 EthPM 进行包管理
安装软件包
安装依赖
使用安装的合约
发布自己的软件包
Ropsten, Ropsten, Ropsten
包配置
命令
在发布之前
用 NPM 进行包管理
包文件布局
使用包
安装
在合约代码中使用包
在JavaScript中使用包
包的部署地址
发布之前
调试合约
概述
调试命令
调试器界面
(o) 跳过(step over)
(i) 进入(step into)
(u) 跳出(step out)
(n) 下一步(step next)
(;) 单步指令(step instruction)
(p) 打印指令(print instruction)
(h) print this help
(q) 退出
(r) 重置(reset)
(b) 设置断点(set a breakpoint)
(B) 移除断点(大写的B)
(c) 跳到下一个断点
(+) 添加一个监视表达式
(-) 移除监视表达式
(?) 列出所有的监视表达式及断点
(v) 显示变量
(T) 卸载交易
(t) 加载交易
添加和移除断点
使用控制台
为什么有两个控制台?
命令
登录控制台
登录Develop控制台
配置 Truffle Develop
功能
可用命令
编写外部脚本
命令
文件结构
第三方插件命令
Plugin installation / usage
Creating a custom command plugin
支持 Quorum 开发
已知问题
配置
Using Privacy Features
编写测试用例
测试合约
测试框架
测试用例目录
测试合约命令
”干净的“ 测试环境
速度和可靠性考虑
用 JavaScript 写测试用例
Use contract() instead of describe()
Use contract abstractions within your tests
Using artifacts.require()
Using web3
Examples
Using .then
Using async/await
Specifying tests
Advanced
TypeScript File Support
用 Solidity 写测试用例
Example
Test structure
Assertions
Deployed addresses
Test contract names
Test function names
before / after hooks
Advanced features
Testing for exceptions
Testing ether transactions
高级用法
选择网络及部署
配置
指定网络
Build artifacts
应用部署
构建过程
运行外部命令
Providing a custom function
Creating a custom module
Bootstrapping your application
创建 Truffle Box
创建 box
配置文件
ignore (array)
commands (object)
hooks (object)
图片
Truffle site listing
参考引用
选择以太坊客户端
开发过程中
Ganache
Truffle Develop
Ganache CLI
部署到线上网络
部署到私有网络
Truffle 配置
配置文件位置
解决 Windows 命令名冲突
常用配置选项
网络 networks
提供者 Providers
指定合约目录
指定合约构建生成目录
迁移文件目录
mocha
指定编译器
solc
使用外部编译器
插件 plugins
EthPM 配置
包名:package_name
版本:version
描述:description
作者 authors
关键字 keywords
依赖 dependencies
许可协议 license
合约抽象封装
使用方法
API
Contract Abstraction API
MyContract.new([arg1, arg2, ...], [tx params])
MyContract.at(address)
MyContract.deployed()
MyContract.link(instance)
MyContract.link(name, address)
MyContract.link(object)
MyContract.networks()
MyContract.setProvider(provider)
MyContract.setNetwork(network_id)
MyContract.hasNetwork(network_id)
MyContract.defaults([new_defaults])
MyContract.clone(network_id)
MyContract.numberFormat = number_type
MyContract.timeout(block_timeout)
MyContract.autoGas =
MyContract.gasMultiplier(gas_multiplier)
Contract Instance API
Making a transaction via a contract function
Explicitly making a call instead of a transaction
Calling getters
Processing transaction results
Sending Ether / Triggering the fallback function
Estimating gas usage
Truffle 命令手册
使用方法
命令列表
构建 build
编译合约 compile
config
启动控制台 console
创建 create
调试 debug
部署 deploy
控制台 develop
exec
帮助 help
初始化工程 init
安装 install
migrate
网络 networks
操作码 opcode
发布 publish
运行 run
测试 test
解包 unbox
查看版本 version
监视变化 watch
联系开发者
Gitter
Issue Tracker
相关文档
Solidity 中文文档
Web3.js 中文文档
Truffle 中文文档
Docs »
Truffle 命令手册
Edit on GitHub
Truffle 命令手册¶
本节将介绍Truffle应用程序中可用的每个命令。
使用方法¶
所有命令均采用以下形式:
truffle
传递没有参数相当于 truffle help ,将显示所有命令然后退出。
Passing no arguments is equivalent to truffle help, which will display a list of all commands and then exit.
命令列表¶
构建 build¶
已弃用。
truffle build
编译合约 compile¶
编译合约源文件。
truffle compile [--list
除非另有说明,否则将仅编译自上次编译以来已更改的合约。
选项:
--list
--all: 编译所有合约,而不是仅编译自上次编译后更改的合约。
--network
--quiet: 取消所有编译输出。
config¶
显示是启用还是禁用分析,并提示是否切换设置。
truffle config [--enable-analytics|--disable-analytics]
选项:
--enable-analytics|--disable-analytics: 启用或禁用分析。
启动控制台 console¶
运行具有合约抽象和命令的控制台。
truffle console [--network
通过命令行与合约进行交互的接口。此外,许多 Truffle 命令在控制台中使用(不需要 truffle 前缀)
需要外部以太坊客户端,例如Ganache 或 geth ,则使用 truffle develop 创建开发和测试环境的控制台。
有关详细信息,请参阅使用控制台 。
选项:
--network
--verbose-rpc: 记录Truffle和以太坊客户端之间的通信log。
创建 create¶
用于创建新的合约,迁移和测试。
truffle create
选项:
Camel 的命名将转换为下划线分隔的文件名,以用于迁移和测试。将自动生成迁移的编号前缀。
调试 debug¶
交互式调试区块链上的任何事务。
truffle debug
将在特定事务上启动交互式调试会话。允许您逐步执行每个操作并重播(replay)。有关详细信息,请参阅调试合约 。
注解
警告:调试命令依然是实验性的。
选项:
部署 deploy¶
migrate 的别名. 参考 migrate 。
控制台 develop¶
使用框架集成的 develop 链打开控制台
truffle develop
通过命令行与框架集成的 develop 链上合约进行交互的接口。此外,许多 Truffle 命令在控制台中使用(不需要 truffle 前缀)
如果想要现有的区块链上合约进行交互,请使用 truffle console 。
有关详细信息,请参阅使用控制台 。
exec¶
在Truffle环境中执行JS模块。
truffle exec
会引入 web3 ,根据指定的网络(如果有)设置默认提供者(provider),并在执行脚本时将引入我们的合约作为全局对象。提供的脚本必须导出Truffle可以运行的函数。
有关详细信息,请参阅编写外部脚本 。
选项:
--network
--compile: 在执行脚本之前编译合约。
帮助 help¶
显示所有命令的列表或特定命令的信息。
truffle help [
选项:
初始化工程 init¶
初始化新的(空的)以太坊项目
truffle init [--force]
在当前工作目录中创建一个新的空Truffle项目。
注解
警告: 较旧版本的 Truffle 使用 truffle init bare 来创建一个空项目。此用法已被弃用。
基于某一个实例来创建应该使用如 truffle unbox MetaCoin 。
选项:
--force: 无论当前工作目录的状态如何,都要初始化项目。请注意,这可能会覆盖名称冲突的现有文件。
安装 install¶
从以太坊包注册表(Ethereum Package Registry)安装包。
truffle install
选项:
@
有关详细信息,请参阅使用EthPM进行包管理 。
migrate¶
运行迁移文件以部署合约。
truffle migrate [--reset] [--f
除非指定,否则将从上次完成的迁移开始。有关详细信息,请参阅(迁移)合约部署 。
选项:
--reset: 从头开始运行所有迁移,而不是从上次完成的迁移中运行。
--f
--to
--network
--compile-all: 编译所有合约,而不是智能地选择需要编译的合约。
--verbose-rpc: 记录Truffle和以太坊客户端之间的通信日志。
--dry-run: 分叉(fork - 复制)指定的网络并仅执行测试迁移。
--interactive: 在 dry run 之后,提示确认用户是否要继续。
网络 networks¶
显示每个网络上已部署合约的地址。
truffle networks [--clean]
在发布包之前使用此命令,以查看是否存在不希望发布的任何无关的网络的工件(artifacts)。如果未指定选项,只输出当前的工件状态。
选项:
--clean: 删除所有与命名网络(named network , 是指在配置文件中指明的网络)无关的网络工件。
操作码 opcode¶
打印给定合约的已编译操作码。
truffle opcode
选项:
发布 publish¶
将包发布到以太坊包注册表(Ethereum Package Registry)。
truffle publish
所有参数都从项目的配置文件中提取。没有参数,有关详细信息,请参阅使用EthPM进行包管理 。
运行 run¶
注解
仍处于”准系统状态”的新功能,可向 Truffle 反馈改进意见!
运行第三方插件命令
truffle run
选项:
安装插件作为NPM包依赖项存在,参考Truffle 配置 了解插件
有关更多信息,请参阅第三方插件命令.
测试 test¶
运行JavaScript和Solidity测试用例。
truffle test [
运行 test/ 目录中的全部测试用例,或指定用例文件。有关详细信息,请参阅 测试合约 。
选项:
--compile-all: 编译所有合约,而不是智能地选择需要编译的合约。
--network
--verbose-rpc: 记录Truffle和以太坊客户端之间的通信日志。
--show-events: 记录所有合约的事件。
解包 unbox¶
下载Truffle Box , 它是一个预制(pre-built)的 Truffle 工程。
truffle unbox
下载 Truffle Box 到当前工作目录。请参阅可用boxes列表.
还可以设计和创建自己的boxes! 有关详细信息,请参阅Truffle boxes 。
选项:
--force: 强制在当前目录中的解包项目,无论其状态如何。请注意,这可能会覆盖目录中存在的文件。
查看版本 version¶
显示版本号并退出。
truffle version
监视变化 watch¶
监视文件系统以进行更改并自动重新构建(rebuild) 项目。
truffle watch
此命令将启动对合约,应用程序和配置文件更改的监视。当有更改时,它将根据需要重新构建应用程序。
注解
警告:不推荐使用此命令。请使用外部工具来监视文件系统更改并重新运行测试。
Next
Previous
© Copyright 2019, 深入浅出区块链
最后更新于 2019/05/21.
Built with Sphinx using a theme provided by Read the Docs.