Web3 被称为去中心化版本的英特网,它有一个长处是任何人都能够与部署在区块链上的智能合约交互。家喻户晓,智能合约就是你在区块链上运行的一段电脑程序,这些程序的源代码是公开的,任何人都能够验证。如果想要和合约交互,任何人都能够运行一个区块链客户端而后通过命令行工具创立交易来实现,而不须要网页 UI 与其进行交互。</p>
Etherscan 是一个对于泛滥区块链网络的区块浏览器,这些区块链网络包含:Ethereum,Polygon,Arbitrum,Optimism 和很多其余别的。如果你想要理解如何通过 Etherscan 和智能合约交互,请浏览最近这篇通过 Etherscan 读取智能合约。</p>
然而在上篇文章中,咱们只能够在 Etherscan 上和验证过的智能合约进行交互。在本篇文章中,你将会学到如何在 Etherscan 上验证智能合约。</p>
验证繁多 Solidity 文件
在开始验证之前,咱们须要首先部署智能合约。进入 Remix IDE,创立一个叫做“Counter.sol”的新文件。复制粘贴上面的代码:</p>
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter {
uint256 internal counter;
function increment() external {
unchecked {++counter;}
}
function getCurrent() external view returns(uint256) {return counter;}
}
在部署之前,咱们必须关注一下咱们应用的 Solidity 编译器是哪个版本,和在合约代码最上方“SPDX-License-Identifier”中标注的 license 类型。
因为咱们在合约文件中标注了“^0.8.0”,所以这个合约能够被任何版本号为 0.8.0 和 0.9.0 之间的 solidity 编译器编译,这样就蕴含多个版本的比方 0.8.0,0.8.1,0.8.2 等等。
在“Solidity Compiler”下,抉择 Solidity 的编译器版本(能够是任何 0.8 的版本),而后点击“Compile Counter.sol”。在这个例子中,咱们会应用 0.8.7 版本。
在胜利编译当前,到“Deploy & Run Transactions”上面,在“Environment”的下拉菜单中,抉择“Injected Provider – Metamask”,它会主动链接你的 Metamask 到 Remix IDE。在此之后,你就能够在钱包中抉择你要部署的区块链网络。
咱们会将合约部署到 Rinkeby 中,因而咱们须要在 Metamask 中抉择“Rinkeby Test Network”。在部署的时候须要应用 Rinkeby 的 ETH,你能够在 Chainlink 水龙头中获取一些。在获取的时候,留神在右上角抉择的是 Ethereum Rinkeby 网络。
最初,点击橙色的按钮“Deploy”,而后通过 Metamask 对交易进行签名。可能须要期待大略 15 秒钟,你的交易会被确认。当然当初咱们就能够通过 Remix IDE 的 UI 与智能合约交互,然而如果咱们想让更多人和咱们的智能合约交互,这个形式就不可行了。
当初,能够通过交易哈希或者合约地址在 Etherscan 上看到咱们刚部署的合约。如果咱们当初在 Contract 之下查看合约,只能看到 Bytecode,这意味着咱们须要验证咱们的智能合约,而后能力在 Etherscan 上应用它。
点击“Verify and Publish”这个蓝色的链接,上面这个页面会呈现。
在第一个输出栏中输出你的合约地址,如果没有主动跳进去的话。在 Compiler Type 的下拉菜单中,抉择“Solidity (Single File)”。接下来,“Compiler Version”的下拉菜单将会呈现,这里须要抉择咱们用来编译这个合约的编译器版本,在这个例子中是 0.8.7。最初,在“Open Source License Type”下拉菜单中,抉择在 Solidity 文件中“SPDX-License-Identifier”中标记的 License。在咱们的例子中是 MIT。点击持续,进入到下一个页面。
将合约的源代码复制到“Enter the Solidity Contract Code below”这个输入框之下,过了人机测试,点击“Verify and Publish”的蓝色按钮。你应该就会看到在“Contract”上会有一个绿色的对勾,这就示意你的合约曾经验证胜利,而后咱们当初就能够与其交互了。
点击“Read Contract”按钮,你应该能够调用“getCurrent”函数,而后看到 counter 这个变量的值,当初是默认值 0。
点击“Write Contract”按钮,你应该能够把你的钱包连贯到 Etherscan 网站上,而后调用“increment”函数。在点击按钮当前,MetaMask 会弹出,对交易签名(留神你须要应用 Rinkeby 网络)。在你的交易被胜利写入区块当前,你能够回到“Read Contact”区域,而后再次调用“getCurrent”函数,会发现当初的 counter 变量变成 1 了。
通过 Flattener 插件验证多 Solidity 文件的
<p> 方才是在 Etherscan 上的合约验证过程,然而方才的例子是繁多 Solidity 文件,通常状况下咱们要解决的不是繁多的 Solidity 文件,因为你在智能合约中常常会引入其余的合约,接口和库。</p>
让咱们应用 Chainlink 的 Price Feed Consumer 合约作为例子,创立一个新的 Solidity 文件,名字叫“PriceFeedConsumer.sol”,上面的代码是从 Chainlink 官网文档中粘贴的:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumerV3 {
AggregatorV3Interface internal priceFeed;
/**
* Network: Rinkeby
* Aggregator: ETH/USD
* Address: 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
*/
constructor() {priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e);
}
/**
* Returns the latest price
*/
function getLatestPrice() public view returns (int) {
(
/*uint80 roundID*/,
int price,
/*uint startedAt*/,
/*uint timeStamp*/,
/*uint80 answeredInRound*/
) = priceFeed.latestRoundData();
return price;
}
}
“import“@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;”
这一行意味着咱们须要引入其余接口,接口不是一个智能合约,它会列出相干的函数,然而没有实现的函数体。接口有两个作用,第一个是被某一个智能合约继承从而实现列出的函数,第二个是用来调用实现了这些函数的某个合约。在这个例子中,咱们会用到它的第二个作用,即调用 Chainlink Aggregator 合约中的“latestRoundData”函数。</p>
咱们还是通过 0.8.7 的 Solidity 编译器版本,License 还是应用 MIT,咱们能够从第一行中看到。</p>
在胜利部署当前,回到 Remix IDE,找到“PriceFeedConsumer.sol”,右键点击,而后点击“Flatten”。
这个命令会生成一个新的文件叫做“PriceFeedConsumer_flat.sol”,这个文件将会把所有的 import 都换成被引入合约,接口或者库的源代码。
能够留神一下 Remix IDE 有一个“Flatten”的页面,会被主动激活。第二种将合约 flatten 的办法就是点击左下角的“Extension”按钮(在“Settings”按钮之上,样子是一个电源插头)而后点击“Flattener”旁边的绿色的“Activate”按钮。
而后,到 Flattener extension 页面,点击“Flatten PriceFeedConsumer.sol”按钮。留神这个动作不会创立新的文件,而是将曾经 flatten 的源代码复制到剪切板,以便咱们能够将它粘贴到 Etherscan 的验证页面。
用哪种办法来 flatten 你的合约取决与你。
当初,当咱们到 Etherscan 的验证页面后,像上次操作一样,抉择:
- For Compiler Type — Solidity (Single File)
- For Compiler Version—- v0.8.7+commit.e28d00a7
- For Open Source License Type — MIT License (MIT)
而后点击“Continue”按钮。
在接下来的页面,在文本框“Enter the Solidity Contract Code below”中,粘贴“PriceFeedConsumer_flat.sol”文件。
实现人机验证,而后点击“Verify and Publish”按钮。
应用 Etherscan 插件实现多个 Solidity 文件的验证
另外一种验证蕴含多个 Solidity 文件合约的办法是应用“Etherscan – Contract Verification”这个 Remix IDE 插件。
咱们应用曾经写好的“PriceFeedConsumer.sol”合约,再次部署它。在此之后,在 Extension 中激活“Etherscan – Contract Verification”插件。
当初到 Etherscan 而后注册一个账户,在你的账户设置中,找到“API Keys”局部,生成一个收费的 API key。
而后回到 Remix IDE,点击“Etherscan – Contract Verification”,将你的 API Key 粘贴在这里,点击“Save API key”按钮。
而后抉择你想要验证的的合约,提供合约地址,点击“Verify Contract”。好了,你的合约当初就曾经在 Etherscan 中被验证了。
总结
在这篇文章中,咱们学会了如何通过 Remix 和 Etherscan 以多种办法验证智能合约。
您能够关注 Chainlink 预言机并且私信退出开发者社区,有大量对于智能合约的学习材料以及对于区块链的话题!