app开发者平台在数字化时代的重要性与发展趋势解析
818
2022-11-26
[区块链笔记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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~