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

网友投稿 818 2022-11-26

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

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

文章目录

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

铺垫知识

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

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

环境搭建

这篇笔记里需要用到使用truffle示例中的MetaCoin合约,​​truffle unbox webpack​​​,我这里下不下来,所以用git-。​​​git clone 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()​​就可以了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringMVC @ResponseBody 415错误处理方式
下一篇:系统调用捕获和分析—通过ptrace获取系统调用信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~