还在以MetaCoin box为例,
一、下载MetaCoin box
mkdir metacoin
cd metacoin
truffle unbox metacoin
二、编译合约
切换到项目工程所在根目录,然后在终端中键入
truffle compile
三、合约部署
truffle migrate
这将部署在项目的 migrations
目录中的所有迁移文件。
最简单的迁移只是一组管理部署脚本。
如果我们的迁移先前已成功运行,则 truffle migrate
将从上次运行的迁移开始执行,仅运行新创建的迁移。
如果不存在新的迁移,truffle migrate
将不会执行任何操作。
我们可以使用 --reset
选项从头开始运行所有迁移。
对于本地测试,确保在执行 migrate
之前安装并运行了 Ganache等 测试区块链。
四、与合约进行交互
以太坊网络区分将数据写入网络和从网络读取数据,在编写应用程序我们需要关注这个区别。
通常,写入数据称为交易 transaction,而读取数据称为调用 call。
1、交易 Transactions
交易从改变了网络的状态。 交易可以像发送 Ether 到一个帐户一样简单,也可以像执行合约函数或向网络部署新合约一样复杂。
交易的特征是它写入(或更改)数据。 一个交易需要耗费以太运行,称为 “gas”,交易同样需要(较长)时间来处理。
当我们通过交易执行合约的函数时,我们无法接收该函数的返回值,因为交易不会立即处理。
通常,通过交易执行的函数不会返回值,仅仅是返回一个交易ID。
可总结交易的特征如下:
消耗Gas 费用(以太)
会更改网络状态
不会立即执行(需要等待网络矿工打包)
没有执行返回值(只是一个交易ID)。
2、调用 Calls
调用依然可以在网络上执行合约代码,但不会永久更改任何数据(如状态变量)。
调用的特征是读取数据。
当我们通过调用执行合约函数时,我们可以立刻获取到返回值。
可总结调用Call的特点:
免费(不消耗 Gas)
不改变网络状态
立即执行
有返回值
五、登录Develop控制台
truffle develop
yongfei:metacoin yong.fei$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/
Accounts:
(0) 0xcccc0e324886a8853cf7cdb41a1a1b47edea12a5
(1) 0x8342ca5e28dae73efdbd22874e3b6d2444fe6a74
(2) 0xae2d68e685b4e0b0f30803dc64da85f9c5671585
(3) 0x4e0cf608a1438b3c079987fb510f16c38ec69b89
(4) 0xa6c1fbac120ddd7c029fcd74778d5a11c5dc74e5
(5) 0x24536faf397aa653ce7325963d6767ef5691256d
(6) 0x69390e20d9b28fa180846e5b4835f2316651f7a9
(7) 0x860569b6f20cc246cf1d86f168f857003ce52e3a
(8) 0xcc8ac9bc23af433659be2e177c89bab17a1ff27a
(9) 0x990a62cba5ff171aaac586f2f2d94a81d371ee44
Private Keys:
(0) 5dbe2705b5a0361b840e015959362c2b999f7e8a38b2aeedceaaae3f1218a757
(1) 20681eb8c6e7da7df3d2287385f6b1872d7e78c4158f19bbbc3d52905b88653e
(2) 7b955089938b88035b93bc1d306e4af90999e642aef2af62d2d255b67f7eb6a9
(3) 7cedf14ef889b8a3fd665b665a1ae1c3fad1b1ac29d8613400e914d4789ebec6
(4) c58a7bc23c73fd2622c83007b7115ecec62b98024a5ef8fc08cd657602924fae
(5) 9dca9694adc0f4ff8dff3c350ebeaf686132a6022e7d085f342be601ca445c79
(6) 78b2c5afaf07e6d35b95e0a6806f59fff74a4bf395b9ed5a96f55cafd42fcbed
(7) 6585c3618605cdb649644a2e01ae44f7bb310d27e7b74b309ad1139b83fab68d
(8) ccdc0204a47eb1b59c7ac545eeac025688f5ef0e5267374ede3c84ae1b969cac
(9) bb8e8ec881df5fb7d0b0f17be54ddd2a72eaef8a49aeeed4cd9fee0adb8d901a
Mnemonic: expire thank craft pudding notice bring devote slide comic sword network knife
⚠️ 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.
六、调试合约
1、查看Truffle为我们提供的名为 “MetaCoin” 的 Javascript 对象
truffle(develop)> let instance = await MetaCoin.deployed()
truffle(develop)> instance
2、执行交易Transactions
使用交易调用的方式从一个帐户向另一个帐户发送10个币
truffle(develop)> let accounts = await web3.eth.getAccounts()
truffle(develop)> instance.sendCoin(accounts[1], 10, {from: accounts[0]})
{
tx: '0xf158ba337e65880589c040a8fb5797b0520de066c5e8c6d8e0fc83766d88c9db',
receipt: {
transactionHash: '0xf158ba337e65880589c040a8fb5797b0520de066c5e8c6d8e0fc83766d88c9db',
transactionIndex: 0,
blockHash: '0x28e76c37ae5dd6b82fdd61917c0eab8d75534361e790dc4228a169c1917f3865',
blockNumber: 1,
from: '0xcccc0e324886a8853cf7cdb41a1a1b47edea12a5',
to: '0x699592794880a0613ff62ec68c5da91263fbfe18',
gasUsed: 22872,
cumulativeGasUsed: 22872,
contractAddress: null,
logs: [],
status: true,
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
v: '0x1c',
r: '0xcb6aee468048db8eeb154b11ad8067ee42c9381dd93643f0d96f5eaf41d11af2',
s: '0x12079161744fef0b337f04f5e73cd54ff5dfc2581f6fb4d615ba8755b61b04a1',
rawLogs: []
},
logs: []
}
我们直接调用了抽象合约的sendCoin函数。 它默认使用交易的方式去执行,而不是使用调用。
我们还用一个对象作为第三个参数传递给sendCoin函数。 注意,在 Solidity 合约中的sendCoin函数没有第三个参数。 这是一个特殊对象,它始终可以作为最后一个参数传递给函数,该函数允许我们编辑有关交易的特定信息。 在这里,我们设置了from地址,确保此交易来自accounts [0]
附sendCoin函数定义
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfer(msg.sender, receiver, amount);
return true;
}
3、执行调用 call
继续使用MetaCoin,注意getBalance函数是从网络读取数据的理想选择。 它不需要进行任何更改,因为它只返回地址参数的 MetaCoin 余额。
网友评论