# 第八周 随机数

关注我的推特(<https://twitter.com/SoullessL>) ，及时获取Alchemy 教程的最新信息。

### 准备

由于 <https://optimismfaucet.xyz> OP测试网的测试代币需要github注册满1个月才能获取，估计大家都没有满1个月，所以就在以太坊Goerli测试网做这个任务，如果你有OP测试网的代币，你也可以把涉及到的以太坊Goerli测试网的地址改成OP测试网就行。

如果你实在想在OP上做，那么你可以去<https://app.optimism.io/bridge> 把你在以太坊Goerli测试网的ETH跨链到OP的Goerli测试网，跨链需要等待好几分钟。

OP测试链信息 <https://chainlist.org/zh/chain/420>，你可以直接加到Metamask。

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FjH5RjONvM46aP5fDUJQ7%2Fimage.png?alt=media&#x26;token=98f29799-ec05-45b4-b2a5-8464d64abe40" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FP5VPpraxZYHe5dvS0qpZ%2Fimage.png?alt=media&#x26;token=fb7754c8-b5d8-436f-836b-d8dd499dd23f" alt=""><figcaption></figcaption></figure>

<https://github.com/qbzzt/qbzzt.github.io/tree/master/LogRocket/20220615-random> 进入下面的网址，点击fork，把代码复制到我们自己的github，Repository name可以随意修改。

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FiNfaOayySPMDIyggUx0j%2Fimage.png?alt=media&#x26;token=d1ea233e-fb64-413c-befd-957b9130cbc5" alt=""><figcaption></figcaption></figure>

复制完以后我们会进入我们自己的Github代码地址，我们复制这个地址

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FQmhMqXUcnXraYmSnn9VU%2Fimage.png?alt=media&#x26;token=3d090c39-283c-4ff0-a60c-af128782ab18" alt=""><figcaption></figcaption></figure>

然后进入 <https://gitpod.io/workspaces> ，点击新建WorkSpace，输入我们刚才复制的地址，新建space

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FfVx1DihTNJzO1jODuHeI%2Fimage.png?alt=media&#x26;token=adfee80a-65b4-4896-951a-ed1f99c8e524" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2F0wvuGcaSlcixfC8z4lKy%2Fimage.png?alt=media&#x26;token=b6c47558-d02a-4cad-83cb-f02b346c8f52" alt=""><figcaption></figcaption></figure>

进入代码编辑器以后，我们点击左上角，然后在弹出的窗口里选择File->Open Folder，然后在弹出的窗口输入 /workspace/week8/LogRocket/20220615-random/ （其中的week8是我的Repository name，你们如果新建的名字不是这个，则替换为你们自己的Repository name），然后点击OK按钮，切换文件目录。

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FqJg9DGbKNMpn4KXjxq9f%2Fimage.png?alt=media&#x26;token=704210af-39d8-4cb2-a6f4-85502dea3f16" alt=""><figcaption></figcaption></figure>

然后我们进入Terminal模块，点击右边的加号按钮，然后选择bash，新增一个Terminal，然后我们查看Terminal的命令行路径，如果已经切换到/workspace/week8/LogRocket/20220615-random文件夹下面，那就ok了。

&#x20;然后我们输入命令 npm i，安装依赖包。

```
npm i
```

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FhLXEVVQTAzYZo7lZi25z%2Fimage.png?alt=media&#x26;token=9e8a7682-39f1-44df-ac5d-9ffe90e796d8" alt=""><figcaption></figcaption></figure>

然后我们找到hardhat.config.js文件，将里面的内容替换为

```
require("@nomiclabs/hardhat-waffle");
require('dotenv').config()

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

module.exports = {
  solidity: "0.8.4",

  networks: {
    "goerli": {
       url: "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161",
       accounts: ["{你的以太坊钱包私钥}"]
    }
  }

};

```

其中{你的以太坊钱包私钥}需要替换为你自己的key，私钥用完以后记住删除，防止泄露，也可以用新账号的私钥。这边的url不建议修改成Alchemy的url，最近有点不稳定。

如果你是在OP上做的，那么你的url需要改成OP的测试网 <https://goerli.optimism.io/>

### 执行

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FexFJuxumX0CUTh490JtE%2Fimage.png?alt=media&#x26;token=4517c992-edd3-4709-86ec-60fa3ea317e2" alt=""><figcaption></figcaption></figure>

然后我们在Terminal里面输入下面的命令部署合约到测试网

```
yarn hardhat console --network goerli
```

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2Fc0QI0sDRIytQKA9YiZlu%2Fimage.png?alt=media&#x26;token=ef6d171f-7355-4e33-a998-62287ec7b903" alt=""><figcaption></figcaption></figure>

如果你想重新使用上面的命令（yarn hardhat console --network goerli）开始部署合约，记得把artifacts/cache这两个文件夹删掉（<mark style="color:red;">**正常流程请不要删除**</mark>）。

我们等待合约部署完成，然后输入下面命令

```
signer = await ethers.getSigner();
```

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2F5kh0TJMb5Jc99JJoyMZj%2Fimage.png?alt=media&#x26;token=853a137b-05ef-44a7-809e-a58d18d512f0" alt=""><figcaption></figcaption></figure>

完成以后接着输入下面命令

```
balance0 = await ethers.provider.getBalance((await ethers.getSigner()).address)
```

成功以后输入下面命令

```
factory = await ethers.getContractFactory("Casino")
```

接着输入

```
casino = await factory.deploy()
```

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FLQWHiABd1ZfPZP2zR9Ei%2Fimage.png?alt=media&#x26;token=a0a1aad9-4ab7-4721-94e8-bcf80a4c57d8" alt=""><figcaption></figcaption></figure>

然后分别（一条条输入）输入下面命令

```
const valA = ethers.utils.keccak256(0xBAD060A7)
const hashA = ethers.utils.keccak256(valA)
const valBwin = ethers.utils.keccak256(0x600D60A7)
tx1 = await casino.proposeBet(hashA,{ value: 1e5})
```

稍微等待一段时间，需要等proposeBet执行完成，再输入命令

```
tx2 = await casino.acceptBet(hashA, valBwin, {value: 1e5})
```

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FzJUEGU9hC0CF11Vus35w%2Fimage.png?alt=media&#x26;token=8a33a2cc-e60a-4b3b-a653-9684bb61a059" alt=""><figcaption></figcaption></figure>

等待一段时间以后，进入 <https://goerli.etherscan.io/address/{私钥对应地址}> 查看你的交易记录，如果有如图所示的交易记录，就说明成功了。

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2F3UpElfxh5KOCZyVxftGh%2Fimage.png?alt=media&#x26;token=0c7cddb6-de95-49cb-8a36-2d23c11aa3a0" alt=""><figcaption></figcaption></figure>

如果你使用的是OP的测试网，那么你需要去<https://blockscout.com/optimism/goerli/address/> 来查询你的交易记录。

### 填表

填表地址： <https://forms.gle/Ztv2nLqsV158XEaeA>

<figure><img src="https://3474605129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLWLTncuPjdgdA8s2gM6C%2Fuploads%2FTnkANpevscXULUReJRaH%2Fimage.png?alt=media&#x26;token=11f31ec2-3d3a-4098-aa72-8b246e85e74c" alt=""><figcaption></figcaption></figure>

填表的证明可以用<https://goerli.etherscan.io/address/{私钥对应地址}> 用你地址交易记录里面创建合约的记录点进去就是合约地址，用合约地址提交。OP 测试网请用OP的测试合约地址提交。
