web3eye.eth

Posted on Mar 18, 2022Read on Mirror.xyz

走进科学 | 5. 使用 Remix 调用未开源合约

未开源合约需要获得合约 ABI 信息才能进行调用,获取 ABI 有三种方式:

  • 合约开源的情况下从 Etherscan 的 Code 选项中直接复制;
  • 从网页中解析出 ABI
  • 反编译合约手动构造

本文主要介绍第 2 种获取 ABI 的方法,和前面小节介绍的获取合约地址的方法一致,合约 ABI 的匹配规则为 [{"inputs",以国潮 NFT @ChinaChic_NFT https://chinachic.club/mint 为例(国潮 NFT 已开源,此处仅用于演示用途);另外不建议对未知项目的闭源合约进行调用,可能存在资产损失的风险。

图中匹配行则是完整的 ABI 代码,获取到 ABI 信息后,需要转换为可以在 Remix 操作的合约代码,Remix 是以太坊生态中的开发者工具,用于开发、调试、部署合约,也支持在浏览器端使用;打开任意网页,按下 F12 快捷键打开控制台。

// 在网页中注入 ethers 工具库
document.write('<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script>');
// 声明 ABI,将上方查找到的 ABI 替换至 []。注意:ABI 的格式为 [{"inputs"....}]
var abi = [];
// 将 ABI 转换成可以操作的接口
new ethers.utils.Interface(abi).format(ethers.utils.FormatTypes.minimal).filter(i => i.includes('function'));

可以看到转换后的接口中,publicMint 接口是铸造 NFT 的接口。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Test {
    string public symbol;
    function publicMint () payable public {
        // do nothing
    }
}

这时,我们可以就通过 Remix 调用合约了,将上面的代码粘贴到 Remix 的代码编辑区,Remix 会自动编译合约,左侧会变成绿色的勾表示编译成功;然后选择环境为 Injected Web3,将粘贴该 NFT 合约地址 0x7BC5d353663C4c94fd022d3df0642B56C174B45c,点击 At Address 即可进行操作;可以点击 symbol 获取 NFT 名称进行确认,然后点击 publicMint 唤醒 MetaMask 弹窗执行铸造交易。

以上就是通过 Remix 的方式调用未开源的合约,但是通过人工手动铸造,效率还是很低,后续小节会介绍通过代码来监控交易和定时执行,快人一步发送交易。

关于我们

Web3Eye 是一个专注于技术研究和分享的 Web3 加密技术社区,团队拥有多年区块链研发经验和安全技术能力,以帮助更多人安全地进入 Web3 世界,欢迎关注我们的 Twitter 帐号,了解最新动态。