[区块链笔记6] 利用truffle与合约交互

文章目录

    • 铺垫知识
    • 环境搭建
    • 源码分析
    • 合约抽象
    • 通过web3.js与合约交互
    • 交易执行结果
    • 获取指定地址合约的合约抽象
    • truffle向合约发送以太

铺垫知识

在以太坊网络中,通常把写入数据称为交易,而读取数据称为调用

交易 有执行成本,消耗gas、更改网络的状态、不立即处理、通常获取交易的id。
调用 免费,不消耗gas、不改变网络的状态、立即处理、有返回值。

环境搭建

这篇笔记里需要用到使用truffle示例中的MetaCoin合约,truffle unbox webpack,我这里下不下来,所以用git下载。
git clone https://github.com/truffle-box/webpack-box

源码分析

pragma solidity >=0.4.21 <0.7.0;
library ConvertLib {
	//convert:转换   把amount乘转换比率后返回
    function convert(uint amount,uint conversionRate) public pure returns (uint convertedAmount) {
        return amount * conversionRate;
    }
}
pragma solidity >=0.4.21 <0.7.0;
import "./ConvertLib.sol";
contract MetaCoin {
	//从地址映射到金额
    mapping (address => uint) balances;
    //Transfer事件
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    //构造函数-->合约的调用者初值10000
    constructor() public {
        balances[msg.sender] = 10000;
    }
    //转账
    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);
        //emit是触发事件的意思
        return true;
    }
    //获取给定账户的转换后金额
    function getBalanceInEth(address addr) public view returns(uint) {
        return ConvertLib.convert(getBalance(addr),2);
    }
    //获取给定账户的原始金额
    function getBalance(address addr) public view returns(uint) {
        return balances[addr];
    }
}

合约抽象

通过语句MetaCoin.deployed().then(instance => contract = instance)获取MetaCoin合约的抽象,并返回给contract变量。这时就可以通过contract变量来访问其中的方法了。

通过web3.js与合约交互

通过web3.eth.accounts可以获得Ganache网络上的所有账户地址
用变量来接一下var accounts = web3.eth.accounts

交易参数 – sendCoin函数没有第3个参数,传入了第三个参数{from: accounts[0]},当然也可以不写
这个参数是一个特殊参数,称为交易参数,它总是可以作为最后一个参数传递给一个函数,用于设置交易的相关细节。交易参数还有很多,这里不详细说明。

然后通过
testContract.getBalance(accounts[0])
testContract.getBalance(accounts[1])
语句来查询两个账户的balance信息,注意这里并不是真的转账,只是在mapping里面的转账

交易执行结果

var result = testContract.sendCoin(accounts[1], 5)
result会返回很多信息,这里只记录一部分
result.tx–交易的哈希值ID
result.logs–交易日志
result.receipt–交易单据
但是有个问题,菜鸡能够返回result,但是无法获取里面的属性,不知道咋个回事。

获取指定地址合约的合约抽象

如果已经有了合约地址,则可以创建一个合约抽象来表示该地址处的合约。
const specificInstance = await MetaCoin.at("0x1234...");

truffle向合约发送以太

通过instance.sendTransaction()或者instance.send()就可以了。

你可能感兴趣的:(区块链)