{"content":{"title":"在 Berachain 上部署 ERC20 合约","body":"`Berachain` 是一个高性能 EVM 兼容 L1 区块链，利用流动性证明 (PoL) 作为共识机制，在执行层方面，Berachain 与以太坊虚拟机（EVM）运行时环境相同，可以使用现有的未经修改的执行客户端（例如 Geth、Reth、Erigon 等）来处理智能合约的执行，并支持 EVM 自带的所有工具。\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/hCzBDiKt669f68db4c3f5.png)\r\n\r\n目前熊链处于测试网V2阶段，主网还未上线，所以本文主要讨论如何在测试网 `Berachain bArtio` 上部署ERC20合约。\r\n\r\n## 领水\r\n部署合约需要用熊链的代币（`BERA`）做 gas，可以到[熊链水龙头](https://bartio.faucet.berachain.com/)领取，领取条件是需要在ETH主网有0.001ETH的资金， 一次可以领1BERA。\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/Czggz5zK669f6c7b2d9d8.png)\r\n\r\n\r\n## 安装 Foundry\r\n```bash\r\n$ curl -L https://foundry.paradigm.xyz | bash\r\n$ foundryup\r\n```\r\n\r\n## 构建项目\r\n我们现在开始在熊链测试网上部署一个代币名为 `Betu（BETU）` 的ERC20合约。\r\n###  初始化\r\n使用 `forge` 初始化一个项目 `betu`：\r\n```bash\r\n$ forge init betu;\r\n```\r\n\r\n\r\n`forge` 会初始化生成项目的结构，并包含默认的合约及测试文件。\r\n\r\n```bash\r\n$ cd betu \r\n$ tree -L 2\r\n.\r\n├── foundry.toml\r\n├── lib\r\n│   └── forge-std\r\n├── README.md\r\n├── script\r\n│   └── Counter.s.sol\r\n├── src\r\n│   └── Counter.sol\r\n└── test\r\n    └── Counter.t.sol\r\n```\r\n\r\n删除默认的文件：\r\n```bash\r\n$ rm src/Counter.sol test/Counter.t.sol script/Counter.s.sol\r\n```\r\n\r\n\r\n### 安装依赖 OpenZeppelin\r\nOpenZeppelin 提供各种 ERC 标准（包括 ERC-20）的常用接口和实现，使用 OpenZeppelin 提供的 ERC-20 接口可以快速创建ERC20合约而无需重新造轮子。\r\n```bash\r\n$ forge install openzeppelin/openzeppelin-contracts --no-commit\r\n```\r\n\r\n新建路径映射文件 `remappings.txt` 方便引用：\r\n```bash\r\n$ vim remappings.txt\r\n```\r\n\r\n文件中使用以下内容告诉 Foundry 在编译合约时在哪里可以找到 `@openzeppelin` 库：\r\n\r\n```txt\r\nds-test/=lib/forge-std/lib/ds-test/src/\r\nforge-std/=lib/forge-std/src/\r\n@openzeppelin/=lib/openzeppelin-contracts/ //[!code focus]\r\n```\r\n\r\n### 创建代币合约\r\n在 `src/` 文件夹中创建一个名为 `BETU.sol` 的新文件，并导入 OpenZeppelin ERC-20 合约。对于代币的3个属性设置如下：\r\n- Name：Betu\r\n- Symbol：BETU\r\n- Supply：100000\r\n```solidity\r\n// SPDX-License-Identifier: UNLICENSED\r\npragma solidity ^0.8.20;\r\n\r\n\r\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\"; \r\n\r\ncontract BETU is ERC20 {\r\n    uint256 public constant INITIAL_SUPPLY = 100_000 * 1 ether;\r\n\r\n    constructor() ERC20(\"Betu\", \"BETU\"){\r\n        _mint(msg.sender, INITIAL_SUPPLY);\r\n    }\r\n}\r\n```\r\n\r\n这是一个最简单的代币合约，在部署的时候会向部署合约的钱包（`msg.sender`）中铸造10万个代币。\r\n\r\n\r\n## 部署合约\r\n使用 `forge` 将合约部署到 Berachain 测试网：\r\n```bash\r\n$ forge create --rpc-url https://bartio.rpc.berachain.com/ --private-key <YOUR_PRIVATE_KEY> src/BETU.sol:BETU --legacy\r\n\r\n# Deployer: 0xF386257B526C76123deCBf1A94428e8EC9A3E259\r\n# Deployed to: 0x624ab6d3c40ca2EcAB272dc457d49B3e46CE6FCd\r\n# Transaction hash: 0x0aa279ff173b0f111ce2e067c0a210e26f74503266e6ac2bd83e856ac3807b1f\r\n\r\n```\r\n`<YOUR_PRIVATE_KEY>` 替换为要部署合约的钱包的私钥，为了方便使用部署命令同时避免存储私钥，可以写一个脚本进行部署，以命令行参数的形式接收私钥，实现一个脚本 `deploy.sh` :\r\n```bash\r\n#!/bin/bash\r\n\r\nif [ -z \"$1\" ]; then\r\n  echo \"Usage: $0 <YOUR_PRIVATE_KEY>\"\r\n  exit 1\r\nfi\r\n\r\nforge create --rpc-url https://bartio.rpc.berachain.com/ --private-key $1 src/BETU.sol:BETU --legacy                                                  \r\n```\r\n\r\n使用 `deploy.sh` 部署：\r\n```bash\r\n$ ./deploy.sh <YOUR_PRIVATE_KEY>\r\n```\r\n\r\n\r\n**注意：开发用的钱包不要用有资金的钱包，同时避免把私钥上传到 github**\r\n\r\n可以在[ Berachain 浏览器](https://bartio.beratrail.io/tx/0x0aa279ff173b0f111ce2e067c0a210e26f74503266e6ac2bd83e856ac3807b1f) 查看交易详情：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/H2y4Wlvg669f7eedac6bf.png)\r\n\r\n\r\n可以看到自己的钱包里的 `BETU`代币：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/07/uCbfCsDM669f7f5d78e44.png)\r\n\r\n\r\n## 总结\r\n因为 `Berachain` 是EVM兼容的L1链，构建在名为 BeaconKit 的模块化 EVM 共识客户端框架之上，所以部署合约和在EVM上一样，如果之前在其他EVM链上部署过合约，在 Berachain 部署就只是换了一个链而已，可以使用自己最熟练的框架进行部署。\r\n\r\n熊链创新性的提出了流动性证明共识机制（`PoL`），其核心价值主张来自于它同时扩展流动性和安全性的能力，实现用户、dApp 和验证者之间激励的健康协调，以 `PoL` 为核心构建的应用将捕获熊链生态系统中的大部分价值。作为开发者也可以参与到熊链的生态建设中，发挥出自己的价值，推动web3技术的快速发展。"},"author":{"user":"https://learnblockchain.cn/people/10520","address":"0x673766c46232bFf16B89e341584c14aC2e6276B6"},"history":"bafkreietlzvtsfxro3x66bd5kwmwphcebwcduyjq24qjvwpbhwvt5xjiue","timestamp":1724331789,"version":1}