经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
如何调用以太坊智能合约
来源:cnblogs  作者:KRDecad3  时间:2019/10/28 10:12:07  对本文有异议

First and foremost

在CTF的智能合约题目里,一个很大的瓶颈(对于我自己??)就是不知道该如何调用合约,尤其是无源码的合约逆向。学习了一些文章,大概掌握了一些方法,因此再造个轮子记忆一下。可能还不是很全,学到新的再去补充。

需要用到的工具就是Remix IDE和MetaMask插件钱包。

通过部署源码来调用

当然,自己写的合约放在Remix里编译部署后就可以直接调用;如果是别人的合约,并且我们能够拿到合约地址和源码,依然可以使用Remix来调用。
这里以一道题目举例
合约代码:

  1. pragma solidity ^0.4.21;
  2. contract CallMeChallenge {
  3. bool public isComplete = false;
  4. function callme() public {
  5. isComplete = true;
  6. }
  7. }

在Ropsten测试网络下,题目给出了合约源码及其地址,要求调用callme()函数。

首先编译合约源码:

因为本题环境是在Ropsten测试网络下,Environment应选择“Injected Web3”,并且MetaMask是需要登录的。

然后在“At Address”栏里填入合约地址并点击该按钮部署合约:

之后会出现部署好的合约及其函数:

然后点击callme按钮就能调用callme函数,等待交易完成后,点击isComplete就可以看到结果为true了:

在调用合约的时候我尝试更改一下代码里的函数名称,发现和原代码不一样的话,部署后的合约函数无法正常调用,或许只能与原代码相同的前提下才可以调用成功。

这是最简单的合约调用方式,但也只能满足手动的交互。

通过Web3.js调用合约

在浏览器里按F12打开js控制台,就可以直接使用web3的库,这样的话可以直接在浏览器执行js代码调用合约。

还是通过一道题目举例

题目源码:

  1. pragma solidity ^0.4.21;
  2. // Relevant part of the CaptureTheEther contract.
  3. contract CaptureTheEther {
  4. mapping (address => bytes32) public nicknameOf;
  5. function setNickname(bytes32 nickname) public {
  6. nicknameOf[msg.sender] = nickname;
  7. }
  8. }
  9. // Challenge contract. You don't need to do anything with this; it just verifies
  10. // that you set a nickname for yourself.
  11. contract NicknameChallenge {
  12. CaptureTheEther cte = CaptureTheEther(msg.sender);
  13. address player;
  14. // Your address gets passed in as a constructor parameter.
  15. function NicknameChallenge(address _player) public {
  16. player = _player;
  17. }
  18. // Check that the first character is not null.
  19. function isComplete() public view returns (bool) {
  20. return cte.nicknameOf(player)[0] != 0;
  21. }
  22. }

CaptureTheEther合约的作用是给账户添加一个昵称,并且已经部署在了Ropsten上,地址为0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee。我们需要调用该合约给自己账户添加昵称。

因为以太坊分主网和测试网络之分,个人实验了一下,如何在其它页面调用web3可能只是在主网上,如果以Ropsten网络账户登录下的Remix页面,则调用web3时是在Ropsten网络上操作。

把合约源码放入Remix中编译,可以得到合约的ABI:

这里的Web3Deploy是可以直接使用的JS代码,其中第一行就是合约ABI,类似JSON数据:

下面就是调用合约的JavaScript代码,在Remix页面下按F12进入js控制台里执行,并支付交易费(你在执行这段代码的时候,就是用的你此时的账户)。

  1. var abiDefinition = [{"constant":false,"inputs":[{"name":"nickname","type":"bytes32"}],"name":"setNickname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nicknameOf","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"}];
  2. var CaptureTheEther = web3.eth.contract(abiDefinition);
  3. // load from deployed contract. replace the address with yours
  4. var cte = CaptureTheEther.at("0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee");
  5. // call `setNickname` function
  6. cte.setNickname("your nickname", console.log);

接下来用题目生成的地址部署NicknameChallenge合约,将自己账户地址传入构造函数,点击deploy,调用isComplete函数看到结果是true,就说明昵称添加成功。

原文链接:http://www.cnblogs.com/KRDecad3/p/11745568.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号