以太坊开发(truffle框架) Hello,I'm solidity。
运行测试 以太坊环境
- 打开新的终端 运行
testrpc
命令。 运行 以太坊环境到后台
testrpc > std.log &
。- 这样不好之处就是 如果想看
testrpc
的输出,你需要到std.log
查看,因为输出重定向到std.log
了。 - 好处就是,可以把输出记录到
std.log
文件中。
- 这样不好之处就是 如果想看
初始化 truffle 项目
- 找一个你想要放项目的地方。新建一个目录,
mkdir test
(1️以test 为例)。 - 进入这个目录,运行初始化命令,
cd test; truffle init;
。
初始化之后的目录结构是这样的:
.
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js
- 其中
truffle-config
和truffle
留一个即可,目的是防止Windows
下truffle.js
和truffle
命令发生冲突,所以,留下任意一个即可,还是留下truffle-config
,这样即容易移植,按照字面意思,也好理解。这个文件的目的是配置连接的网络,由于我们用的是本地测试网络,配置如下:
module.exports = {
networks: {
development: {
host: "localhost", // 主机名
port:8545, // 端口号
network_id:"*" // 匹配任何network id
}
}
};
contracts
目录就是我们放编写的合约文件了。test
目录放置测试文件。migrations
目录放置,部署文件。
编译之后我们会发现 多出一个 build
文件夹,这个是放置编译后可以部署的json 格式的文件的。
官网说明还有一个app
目录,到现在为止,我还没有弄明白怎么用。(mark 一下)
写一个合约
我使用的环境是,虚拟机,配置samba服务,所以,直接Windows开发(sublimit 3),linux 中(xshell)编译测试。
新加一个 合约文件。(命令可以使用 touch contracts/Hello.sol
)
合约内容如下:
pragma solidity ^0.4.23; // 版本信息
contract Hello { // 合约声明 类似于 class
address a; // 值类型 变量名
string Name;
uint i;
constructor (string name) { // 构造函数 变量值类型 变量名
Name = name;
}
function say() constant public returns (string){ // 函数关键字 函数名 常函数标记 权限标记 返回值标记 函数体
return Name;
}
}
编写合约部署文件
合约部署文件必须是:数字_字符串.js
新建一个合约部署文件。(命令 touch migrations/1_Hello.js
) 注意文件名和合约名的大小写
内容如下:
var Hello = artifacts.require("./Hello.sol"); // 引入 合约
module.exports = function(deployer) {
deployer.deploy(Hello, 'Hello, I\'m solidity。'); // 引入合约,并传参,合约名 合约参数,依次传入。
};
编译部署合约
这里要保持 testrpc 是运行状态。
执行命令 truffle migrate
(直接部署,会自动编译),truffle migrate --reset
(带上 --reset
,是重新部署的意思)
终端的内容:
Using network 'development'.
Running migration: 1_helle.js
Replacing Hello...
... 0x83260341cce252269a1a590dcd6713f90402dd4b00bb853535b996c48287dc87
Hello: 0x701881ed6ff8e198e93bf822457e4f650cfde551 // 注意这里是 合约的地址
Saving successful migration to network...
... 0x88c2280517ef5c852db5af5980301cca62a2a2c3482bb3f45a2e7976b77d5b96
Saving artifacts...
Running migration: 1_initial_migration.js
Replacing Migrations...
... 0x10535c3fb99d06b22b146ab7a8c06a599d702d7e22fe501dfd1e467c6babe01f
Migrations: 0x7d47b73572f48878829617a87265c46af74f0755
Saving successful migration to network...
... 0x977693cb1d0331b54d4eb917a7156f6d194584ba5eb25435ef0929b1aeb5b3db
Saving artifacts...
调试
使用命令 truffle console
进入控制台。
输入 a = Hello.at("0x701881ed6ff8e198e93bf822457e4f650cfde551")
得到合约的实例。
a
变量代表的就是 Hello
的实例。
我们在合约中写了 say 方法,在这里我们可以这样调用。
a.say()
然后输出就是我们写部署函数时传入的参数。
'Hello, I\'m solidity。'
注意
contracts
和migrations
目录下已有的文件不要删除。那两个文件是部署相关文件。如果删除了,可以通过在项目根目录重新初始化获取。- 合约部署文件中的,部署函数的参数问题,一定注意。
- 部署合约的时候,一定保证
testrpc
是运行状态。 函数定义中的
constant
是常函数定义关键字,意思是:承诺自己不修改区块链上任何状态。- 版本为
pragma solidity ^0.4.23;
当我给一个修改属性的函数添加constant
的时候,编译时直接不通过。
- 版本为
评论已关闭