美文网首页
Truffle 合约交互

Truffle 合约交互

作者: BestFei | 来源:发表于2019-10-31 14:27 被阅读0次

还在以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 余额。

相关文章

网友评论

      本文标题:Truffle 合约交互

      本文链接:https://www.haomeiwen.com/subject/ifozvctx.html