以太坊Solidity之Truffle框架的应用实践
【摘要】
一、前言
安装 Solidity 的开发框架 Truffle 和安装 Truffle 的开发客户端,请参考我之前的博客:以太坊Solidity之Truffle的使用流程与集成指南。在放工程的位置,创建一...
一、前言
- 安装 Solidity 的开发框架 Truffle 和安装 Truffle 的开发客户端,请参考我之前的博客:以太坊Solidity之Truffle的使用流程与集成指南。
- 在放工程的位置,创建一个文件夹 truffleTest,来做为工程根目录:
$ mkdir -p /Users/admin/develop/blockchain_workspace/truffleTest
二、初始化框架
- 进入到工程根目录下(现在应该是个空目录),并执行下述命令:
$ cd /Users/admin/develop/blockchain_workspace/truffleTest
$ truffle init
- 正确执行后,将得到下面这样的目录结构:
- 目录结构简单说明如下:
-
- app/ - 应用文件运行的默认目录,这里面包括推荐的 javascript 文件和 css 样式文件目录,但可以完全决定如何使用这些目录;
-
- contract/ - Truffle 默认的合约文件存放地址;
-
- migrations/ - 存放发布脚本文件;
-
- test/ - 用来测试应用和合约的测试文件;
-
- truffle.js - Truffle 的配置文件。
三、放入合约
- 删除 ./contract 目录下的自带 demo 合约,切记不要删除 ./contract/Migrations.sol 合约,它是 Truffle 用来帮助部署的:
$ cd /Users/admin/develop/blockchain_workspace/truffleTest/contracts
$ rm ConvertLib.sol MetaCoin.sol
- 在 ./contract 目录下创建一个自己的合约文件 Greeter.sol:
pragma solidity ^0.4.0;
contract Greeter {
address creator;
string greeting;
function Greeter(string _greeting) public {
creator = msg.sender;
greeting = _greeting;
}
function greet() constant returns (string) {
return greeting;
}
function setGreeting(string _newgreeting) {
greeting = _newgreeting;
}
/**********
Standard kill() function to recover funds
**********/
function kill() {
if (msg.sender == creator)
suicide(creator); // kills this contract and sends remaining funds back to creator
}
}
四、修改发布脚本
- 将 ./migrations/2_deploy_contracts.js 下的内容由:
module.exports = function(deployer) {
deployer.deploy(ConvertLib);
deployer.autolink();
deployer.deploy(MetaCoin);
};
- 修改为:
module.exports = function(deployer) {
deployer.deploy(Greeter);
};
- 目的是去掉原有自带的 Demo 部署流程,修改为要部署的合约,修改完后,记得保存,不然发布时会报错,找不到相关合约。
五、编译
- 进入到工程根目录 ./truffleTest 目录下,进行编译:
$ truffle compile
Compiling Greeter.sol...
Writing artifacts to ./build/contracts
六、启动客户端
- 启动之前安装好的 EthereumJS RPC 客户端:
$ testrpc
EthereumJS TestRPC v3.0.3
Available Accounts
==================
Private Keys
==================
HD Wallet
==================
Mnemonic: degree debate income mask fiber issue album diet unfair police race car
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545
七、部署合约(migrate)
- 部署合约到网络上:
$ truffle migrate
Running migration: 2_deploy_contracts.js
Deploying Greeter...
Greeter: 0xe66038995cf64b14da96d26cbe1c96d30dec0e95
Saving successful migration to network...
Saving artifacts...
- 备注:
-
- 如果报错出现了一些之前编译部署过,但已经不需要的合约,可以用 truffle migrate --reset 来重置部署,但可能根据情况,需要更新移植版本号,来管理不同的版本;
-
- 若误删 Truffle 自带用来部署的合约 ./contracts/Migrations.sol,会出现下述报错,需要补回到 ./contract 目录,重初始化一次得到。
$ truffle migrate
Running migration: 1_initial_migration.js
/Users/admin/develop/blockchain_workspace/truffleTest/migrations/1_initial_migration.js:2
deployer.deploy(Migrations);
^
ReferenceError: Migrations is not defined
at module.exports (/Users/admin/develop/blockchain_workspace/truffleTest/migrations/1_initial_migration.js:2:19)
at /usr/local/lib/node_modules/truffle/lib/migrate.js:109:7
at /usr/local/lib/node_modules/truffle/lib/require.js:82:7
at tryToString (fs.js:425:3)
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:412:12)
八、最终效果
- 使用 truffle console 功能在控制台与合约交互,来看下效果:
$ truffle console
truffle(default)> Greeter.deployed().setGreeting("Hello world!");
'0xf6a00b4466c9ab38d7eb60dc9f8d15f5f1e500e24ea91bd9e28f6233bad08aed'
truffle(default)> Greeter.deployed().greet.call();
'Hello world!'
truffle(default)>
九、常见报错
- 以太坊客户端连接配置不正确,或未正常启动时:
$ truffle console
/usr/local/lib/node_modules/truffle/lib/repl.js:25
if (err) return done(err);
^
ReferenceError: done is not defined
at /usr/local/lib/node_modules/truffle/lib/repl.js:25:21
at /usr/local/lib/node_modules/truffle/lib/repl.js:57:21
at /usr/local/lib/node_modules/truffle/lib/contracts.js:46:25
at /usr/local/lib/node_modules/truffle/node_modules/web3/lib/web3/property.js:119:13
at /usr/local/lib/node_modules/truffle/node_modules/web3/lib/web3/requestmanager.js:82:20
at exports.XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/node_modules/web3/lib/web3/httppro
vider.js:114:13)
at exports.XMLHttpRequest.dispatchEvent (/usr/local/lib/node_modules/truffle/node_modules/xmlhttprequest/lib/XMLHttpRequest.
js:591:25)
at setState (/usr/local/lib/node_modules/truffle/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:610:14)
at exports.XMLHttpRequest.handleError (/usr/local/lib/node_modules/truffle/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
:532:5)
at ClientRequest.errorHandler (/usr/local/lib/node_modules/truffle/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:459:14)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:188:7)
at Socket.socketErrorListener (_http_client.js:309:9)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at emitErrorNT (net.js:1281:8)
- 若合约未进行部署就进行调用,可能出现下述报错:
truffle(default)> Greeter.deployed().setGreeting("Hello world!");
Error: Cannot find deployed address: Greeter not deployed or address not set.
at Function.Contract.deployed (/Users/admin/develop/blockchain_workspace/truffleTest/build/contracts/Greeter.sol.js:311:1
3)
at evalmachine.<anonymous>:1:-53
at ContextifyScript.Script.runInContext (vm.js:37:29)
at Object.exports.runInContext (vm.js:69:17)
at TruffleInterpreter.interpret (/usr/local/lib/node_modules/truffle/lib/repl.js:99:17)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.onLine (repl.js:513:10)
at emitOne (events.js:96:13)
at REPLServer.emit (events.js:188:7)
- 部署时填合约名称有误,本应该写为 deployer.deploy(IntegerLiteral);,却写成了 deployer.deploy(“IntegerLiteral”);:
Deploying undefined...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
TypeError: Cannot read property 'apply' of undefined
at /usr/local/lib/node_modules/truffle/lib/deployer.js:62:28
at process._tickDomainCallback (internal/process/next_tick.js:129:7)
文章来源: blog.csdn.net,作者:╰つ栺尖篴夢ゞ,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Forever_wj/article/details/125645559
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)