本文作者:咔咔

区块链智能合约编写如何保障安全性与合规性?

区块链智能合约编写如何保障安全性与合规性?摘要: 第一部分:智能合约基础概念什么是智能合约?你可以把智能合约想象成“运行在区块链上的自动执行的程序”,自动执行:当预设的条件被触发时,合约会自动执行约定的操作,无需任何中心化机构(如...

第一部分:智能合约基础概念

什么是智能合约?

你可以把智能合约想象成“运行在区块链上的自动执行的程序”

  • 自动执行:当预设的条件被触发时,合约会自动执行约定的操作,无需任何中心化机构(如银行、法院)的干预。
  • 不可篡改:一旦部署到区块链上,合约的代码就不能被修改,这保证了合约的公信力。
  • 透明公开:所有交易和合约状态都对网络上的参与者公开可见(隐私合约除外)。
  • 去中心化:合约存储在分布式账本上,由整个网络维护,没有单点故障。

智能合约能做什么?

  • 加密货币:创建自己的代币(ERC-20)、NFT(ERC-721/ERC-1155)。
  • 去中心化金融:实现借贷、去中心化交易所、稳定币等。
  • 投票系统:创建透明、防篡改的投票应用。
  • 供应链管理:追踪商品从生产到销售的全过程。
  • 数字身份:管理和控制个人数字身份。

开发环境准备

在开始编写之前,你需要安装以下工具:

区块链智能合约编写如何保障安全性与合规性?
(图片来源网络,侵删)
  • Node.js 和 npm:JavaScript 运行时环境和包管理器,建议使用 LTS (长期支持) 版本。
    # 检查是否已安装
    node -v
    npm -v
  • 代码编辑器:强烈推荐 Visual Studio Code (VS Code),并安装以下插件:
    • Solidity by Juan Blanco:提供语法高亮、代码提示和编译功能。
    • Hardhat for VS Code:与 Hardhat 框架集成,提供更好的开发体验。
  • MetaMask:一个浏览器插件钱包,用于与区块链网络(如测试网)交互和签署交易,从 metamask.io 下载并安装。

第二部分:编写你的第一个智能合约 (Hello World)

我们将使用 Hardhat 框架,它是目前最流行、功能最强大的以太坊开发环境之一。

步骤 1:创建 Hardhat 项目

  1. 创建一个新文件夹并进入:

    mkdir my-first-contract
    cd my-first-contract
  2. 初始化 Hardhat 项目:

    npx hardhat

    这会启动一个交互式安装向导,你可以直接按回车键选择默认选项。

    区块链智能合约编写如何保障安全性与合规性?
    (图片来源网络,侵删)
    • ? Do you want to install a sample project? -> Yes (选择 No 也可以,但我们这里选 Yes 来快速开始)
    • ? Hardhat project root: -> (当前目录)
    • ? Enter a name for the sample project: -> my-first-contract
    • ? Select a license type: -> MIT
  3. 安装依赖:

    npm install

步骤 2:编写合约代码

Hardhat 创建了一个 contracts/ 目录,我们在这里创建合约。

  1. 打开 contracts/ 目录,删除 Lock.sol(示例合约),创建一个新文件 Greeter.sol

  2. Greeter.sol 中编写以下代码:

    区块链智能合约编写如何保障安全性与合规性?
    (图片来源网络,侵删)
// SPDX-License-Identifier: MIT
// 这是一个标准的许可证标识符,告诉别人这个代码的许可协议。
// 引入 Hardhat 提供的合约,用于测试等目的
pragma solidity ^0.8.20;
/**Greeter
 * @dev 一个简单的问候合约,可以设置和获取问候语。
 */
contract Greeter {
    // 状态变量:存储在区块链上的数据
    // "string" 是一个字符串类型
    // "public" 关键字会自动为你生成一个 "getter" 函数,让你可以直接通过 `greeter.greeting()` 来访问这个变量
    string public greeting;
    // 构造函数:在合约部署时只执行一次
    constructor(string memory _greeting) {
        greeting = _greeting;
    }
    // 函数:修改合约状态或与合约交互
    // "public" 关键字同样会生成一个 getter 函数
    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
    // view 函数:承诺不修改任何状态,可以免费调用
    function getGreeting() public view returns (string memory) {
        return greeting;
    }
}

代码解释:

  • SPDX-License-Identifier: 标准的许可证声明。
  • pragma solidity ^0.8.20;: 指定编译器版本。^ 表示兼容 0.8.20 到 0.9.0 以下的版本。
  • contract Greeter { ... }: 定义一个名为 Greeter 的合约。
  • string public greeting;: 定义一个公共的状态变量 greeting,用于存储问候语。
  • constructor(string memory _greeting) { ... }: 合约的构造函数,在部署时运行,用于初始化状态变量。
  • function setGreeting(string memory _greeting) public { ... }: 一个公共函数,允许任何人修改 greeting
  • function getGreeting() public view returns (string memory) { ... }: 一个公共函数,用于读取 greeting 的值。view 关键字表示它只读,不消耗 Gas。

步骤 3:编译合约

Hardhat 在 scripts/ 目录下提供了一个编译脚本 compile.js,你也可以直接在终端运行:

npx hardhat compile

如果成功,你会在 artifacts/ 目录下看到编译后的输出文件(ABI 和字节码)。


第三部分:测试智能合约

测试是确保代码质量和安全性的关键步骤,Hardhat 使用 MochaChai 这两个 JavaScript 测试框架。

  1. 打开 test/ 目录,删除 lock.js,创建 greeter.test.js

  2. greeter.test.js 中编写测试代码:

const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Greeter", function () {
  it("Should return the new greeting once it's changed", async function () {
    // 1. 部署合约
    // ethers.getContractFactory 是一个用来获取合约抽象的函数
    const Greeter = await ethers.getContractFactory("Greeter");
    const greeter = await Greeter.deploy("Hello, world!");
    await greeter.waitForDeployment();
    // 2. 初始检查
    // 初始的问候语应该是 "Hello, world!"
    expect(await greeter.greeting()).to.equal("Hello, world!");
    // 3. 调用函数修改状态
    const setGreetingTx = await greeter.setGreeting("Hola, mundo!");
    // 4. 等待交易被确认
    await setGreetingTx.wait();
    // 5. 再次检查问候语是否已更新
    expect(await greeter.greeting()).to.equal("Hola, mundo!");
  });
});

测试代码解释:

  • describe: 定义一个测试套件,描述被测试的对象。
  • it: 定义一个单独的测试用例。
  • ethers.getContractFactory: 获取合约的工厂,用于部署新实例。
  • greeter.deploy(...): 部署合约,传入构造函数参数。
  • greeter.waitForDeployment(): 等待部署交易被打包进区块。
  • expect(...).to.equal(...): Chai 的断言库,用于验证实际值是否等于预期值。
  1. 运行测试:
    npx hardhat test

    如果所有测试通过,恭喜你!你的合约逻辑是正确的。


第四部分:部署到测试网

在将合约部署到主网(花费真实资金)之前,我们总是在测试网上进行演练,测试网是模拟主网的平行网络,其中的 ETH 没有任何价值。

步骤 1:获取测试网 ETH

你需要一些免费的测试网 ETH 来支付部署 Gas 费,你可以从以下水龙头获取:

将你的 MetaMask 钱包切换到对应的测试网络,然后输入你的钱包地址领取测试 ETH。

步骤 2:配置 Hardhat 连接测试网

  1. 在项目根目录下创建一个 .env 文件,用于安全地存储你的私钥和 RPC URL。千万不要将私钥提交到代码仓库!

    # .env 文件内容
    # 从你的 MetaMask 导出的私钥 (以 0x 开头)
    PRIVATE_KEY=你的私钥
    # Sepolia 测试网的 RPC URL,可以从 Alchemy 或 Infura 免费获取
    #  https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY
    SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY
  2. 安装 dotenv 包来加载 .env 文件:

    npm install dotenv
  3. 修改 hardhat.config.js 文件,添加网络配置:

    mkdir my-first-contract
    cd my-first-contract0

步骤 3:编写部署脚本

  1. 打开 scripts/ 目录,删除 deploy.js,创建 deploy.js

  2. deploy.js 中编写部署逻辑:

    mkdir my-first-contract
    cd my-first-contract1

// 等待部署完成 await greeter.waitForDeployment();

// 打印合约地址 console.log("Greeter deployed to:", greeter.target); }

// 执行主函数并捕获错误 main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });


#### 步骤 4:执行部署
1.  确保你的 MetaMask 钱包已连接到 Sepolia 测试网,并且账户中有测试 ETH。
2.  运行部署脚本:
    ```bash
    npx hardhat run scripts/deploy.js --network sepolia
  1. 如果成功,你会在终端看到合约的地址, Greeter deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3

  2. 你可以将这个地址复制到 Etherscan (Sepolia 版本) 上查看你的合约,甚至可以直接在合约页面与它交互(调用 getGreetingsetGreeting)。


第五部分:进阶主题与最佳实践

当你掌握了基础后,可以探索更高级的主题:

  1. OpenZeppelin Contracts:一个标准的、安全的、社区审计过的合约库,你应该优先使用它来实现 ERC20、ERC721、AccessControl 等标准功能,而不是自己从零开始写。

    npm install @openzeppelin/contracts
  2. 事件:智能合约在状态改变时可以触发事件,这些事件被记录在区块链的日志中,非常高效,是前端监听合约变化的主要方式。

  3. 安全:智能合约一旦部署就很难修复,因此安全至关重要,学习常见的安全漏洞,如:

    • 重入攻击
    • 整数溢出/下溢
    • 访问控制不当
    • 前端运行攻击
  4. Gas 优化:理解 Gas 的工作原理,编写节省 Gas 的代码,因为在主网上 Gas 是真实成本。

  5. 前端交互:学习如何使用 ethers.jsweb3.js 库,在前端应用(如 React)中连接用户钱包,调用你的智能合约。

编写智能合约是一个结合了 Solidity 编程密码学经济学安全工程 的复杂领域,本指南为你提供了一个坚实的起点。

学习路径建议:

  1. 掌握 Solidity 基础:数据类型、控制流、函数修饰符、合约交互。
  2. 熟练使用 Hardhat:编译、测试、部署、调试。
  3. 学习 OpenZeppelin:理解标准模式和最佳实践。
  4. 深入研究安全:阅读黑客马拉松的漏洞分析报告,学习如何使用 Slither 等静态分析工具。
  5. 构建完整应用:将智能合约与前端(React/Vue)和后端(Node.js)结合,开发一个去中心化应用。

祝你编程愉快!

文章版权及转载声明

作者:咔咔本文地址:https://jits.cn/content/26267.html发布于 02-12
文章转载或复制请以超链接形式并注明出处杰思科技・AI 股讯

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,1人围观)参与讨论

还没有评论,来说两句吧...