本指南介绍了如何在 Polygon zkEVM 测试网上创建和部署一个与游戏相关的智能合约,并演示了如何与已部署的智能合约进行交互。合约是一个简单的猜Coin游戏,允许两个玩家下注,并通过随机数决定赢家,赢家获得奖金。
在本指南中,我们将演练在 Polygon 的 zkEVM 测试网链上创建和部署与游戏相关的智能合约的过程。我们还将演示如何在部署智能合约后与其进行交互。
你需要的
你要做的
Polygon zkEVM 是一种 layer-2 扩展解决方案,它使用零知识证明来实现以太坊网络上的快速和低成本交易。它被设计为与以太坊完全兼容,使开发人员可以轻松地将其现有的智能合约移植到 Polygon 网络。
要了解更多关于 Polygon zkEVM 的信息,请查看这篇 QuickNode 指南 - 什么是 Polygon zkEVM? 和这篇博文!
在我们开始之前,你需要为 Polygon 设置一个开发环境。按照以下步骤开始:
你需要一个非托管钱包才能在 Polygon zkEVM 上部署智能合约。你可以使用浏览器扩展程序,如 MetaMask 或 Coinbase 钱包。
为了本教程的目的,我们将演示使用 Coinbase 钱包。在你的浏览器上安装扩展程序,然后保存并验证你的助记词。
你不仅需要一个 Web3 钱包,还需要一些 ETH 来支付部署和合约交互的费用。要在 Polygon zkEVM 上获得一些 ETH,你需要从另一个网络(如以太坊主网或 Goerli 测试网)桥接资金。本指南将演示使用 Goerli 测试网桥接到 Polygon zkEVM 测试网。
首先,转到 QuickNode 多链水龙头,并将其粘贴到你的钱包地址以接收一些测试网 ETH。你也可以通过发推文来获得一些额外的 ETH(我推荐这样做!)。
一旦你的钱包充值完毕,转到 主网 或 测试网 桥。连接你的钱包并看到你的余额后,输入你要桥接的数量并确认(签名)交易。
你需要等待检查点,然后在提示时完成桥接转移。请注意,你需要切换网络回到 zkEVM 测试网才能正确签署第二个确认交易。
我们将通过查看区块浏览器这里来验证我们的余额(正如他们所说,“不要相信,要验证”😉)。一旦你的钱包在 Polygon zkEVM 测试网上充值完毕,你就可以进入下一节了!
每个对 Polygon zkEVM 测试网网络的请求都需要一个 API 端点来与网络连接。这就是 QuickNode 发挥作用的地方!欢迎你使用公共节点或部署和管理你自己的基础设施;但是,如果你想要 8 倍更快的响应时间,你可以把繁重的工作交给我们。了解为什么以太坊上超过 50% 的项目选择 QuickNode 并在此处注册一个帐户。请注意,QuickNode 也支持 Polygon zkEVM 主网!
你还应该将你的 QuickNode 端点添加到你的钱包。要在 Coinbase 钱包上执行此操作,请在右上角单击地球图标,然后单击更多网络,然后单击右上角的加号。然后,添加你的详细信息:
对于本指南,我们将创建一个简单的游戏相关的智能合约,允许玩家对抛Coin的结果进行投注。导航到 Remix.IDE,并通过单击 + 按钮创建一个空白工作区。然后,单击文档图标以创建一个新文件并将其命名为 CoinFlip.sol。
在 Remix.IDE 中创建 CoinFlip.sol 文件后,将以下代码粘贴到该文件中:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract CoinFlip {
address public player1;
address public player2;
uint256 public pot;
uint256 public winner;
address public winnerAddress;
event GameStarted(address indexed player1, address indexed player2, uint256 pot);
event GameFinished(address indexed winnerAddress, string winner, uint256 pot);
function enter() public payable {
require(msg.value == .001 ether, "Must send .001 ether to enter");
if (player1 == address(0)) {
player1 = msg.sender;
} else {
require(player2 == address(0), "Both players have already entered");
player2 = msg.sender;
emit GameStarted(player1, player2, pot);
}
pot += msg.value;
winner = 0;
winnerAddress = address(0);
}
function flipCoin() public {
require(msg.sender == player1 || msg.sender == player2, "Sender is not a player");
uint256 result = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, block.coinbase))) % 2;
winner = result == 0 ? 1 : 2;
winnerAddress = winner == 1 ? player1 : player2;
string memory winnerName = winner == 1 ? "player1" : "player2";
emit GameFinished(winnerAddress, winnerName, pot);
payable(winnerAddress).transfer(pot);
pot = 0;
player1 = address(0);
player2 = address(0);
}
}
Remix.IDE 应该会自动编译粘贴的代码。你可以通过检查编译选项卡并查看是否有绿色复选标记来验证这一点。
上面的智能合约旨在使两名玩家能够参与一个游戏,其中获胜者获得彩池。该合约包含两个主要函数,enter() 和 flipCoin()。
enter() 函数用于允许玩家通过向合约发送 0.001 以太币来进入游戏。一旦两名玩家都进入,该函数会发出一个 GameStarted 事件,其中包含两名玩家的地址和彩池值。然后,该函数将每个玩家分配给 player1 或 player2,并将彩池值增加玩家发送的以太币数量。 flipCoin() 函数用于确定游戏的获胜者。此函数检查发送者是否是 player1 或 player2,生成一个随机数以选择获胜者,并将彩池值转移到获胜者的帐户。可以调用 winnerAddress 变量来查看哪个地址赢得了翻转。最后,该函数将 player1 和 player2 的值重置为零,表示游戏结束。这些函数的使用,以及事件的发出和变量的更新,使 CoinFlip 合约能够为两名玩家提供一个简单而透明的机率游戏。
现在我们有了一个编译好的智能合约,我们可以将其部署到 Polygon zkEVM 测试网。导航到 Deploy & Run Transactions 选项卡,并确认在下拉菜单下选择了 CoinFlip.sol 合约。
然后,在环境 (environment) 下,选择 Injected Provider (注入提供程序) 并连接你的钱包。确认选择了正确的网络。
单击 Deploy (部署) 按钮并在你的钱包中确认交易。交易确认后,你应该在 Remix.IDE 的控制台中看到一个输出:
你可以通过检查区块浏览器来验证合约是否已部署。请记住,如果你在 Polygon zkEVM 主网上部署,此过程是相同的。
现在有了已部署的 Coin flip 合约,我们可以在 Remix.IDE 左下角展开 Deployed Contracts (已部署合约) 选项卡。你将看到列出的函数和变量。
要进入抛Coin,在 value 字段中输入 1000000000000000 Wei,然后单击 enter 按钮。确认你钱包中的交易。
我们需要在抛Coin合约中再输入一个条目才能获得获胜者。目前,抛Coin合约设置为同一个地址可以输入两次(我们这样做是为了演示目的),但是,在生产中,你可能需要更改该逻辑。单击相同的 enter 按钮并确认你钱包中的交易。交易确认后,你可以单击 flipCoin 函数按钮以获得获胜者。你将看到其中一个已输入帐户中的余额增加,这是抛Coin的获胜者。
凭借你学到的所有知识,你现在可以更进一步。查看此资源列表,以继续深入研究兔子洞!
恭喜,你已成功在 Polygon zkEVM 测试网链上创建和部署了一个与游戏相关的智能合约!你现在可以使用这些技能在 Polygon zkEVM 网络上创建和部署你自己的智能合约。如果你遇到问题、有疑问或只是想谈谈你正在构建的内容,请在 Discord 或 Twitter 上给我们留言!
如果你对此指南有任何反馈,请告诉我们。我们很乐意听取你的意见!
- 原文链接: quicknode.com/guides/pol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!