首页>>资讯>>产业

OpenZeppelin 区块链智能合约的安全开发工具

2024-10-28 12:42:45 32

OpenZeppelin是一个重要的开源组织,专注于区块链领域,为安全开发、部署和管理智能合约提供有用的功能和服务。它为开发人员在以太坊区块链平台上创建去中心化应用程序(dApps)提供了更简单的方式。该组织成立于2017年。


OpenZeppelin的主要特点


智能合约库:OpenZeppelin提供了一个全面的智能合约库,用于解决通用模式和功能,如代币标准(ERC20、ERC721)、访问控制、可升级性等。


安全性:安全性是OpenZeppelin的重要特点。其合约经过安全专家的测试、审计和评审,减少了已部署智能合约中的漏洞和利用风险。


可升级性:OpenZeppelin提供创建完善智能合约的工具,使开发人员能够修复错误、添加功能或改进合约,而不会干扰现有状态或要求完全重新部署。


开发者工具:OpenZeppelin包含多种工具和实用程序,以增强开发者体验。这些工具有助于合约的部署、测试和与区块链上的智能合约的交互。


社区和支持:OpenZeppelin拥有一个强大的开发者和用户社区,他们为项目做出贡献,分享知识并提供支持。这种协作环境促进了持续改进和创新。


文档:该框架附带了广泛的文档、教程和示例,帮助开发者理解如何使用组件并高效构建安全的去中心化应用程序(dApps)。


我们可以通过https://www.openzeppelin.com  链接访问OpenZeppelin的官方网站


OpenZeppelin合约向导库


开发人员用于构建去中心化应用程序(dApps)的合约向导库主要有三种类型。


库 1. ERC20**


ERC20是一种在以太坊区块链上用于智能合约的技术方法。它定义了一组通用规则,供以太坊代币实施,使开发人员能够创建可互操作的代币,方便交易和管理。


OpenZeppelin合约向导提供的“ERC20”的特点:


可铸造:在代币合约中,该功能允许通过“铸造新代币”的函数创建新代币。此功能由私有账户或治理流程控制。


可销毁:这是OpenZeppelin合约向导的一个功能,代币持有者可以销毁其代币,从而自愿减少其代币供应,基于其经济条件。


可暂停:这是OpenZeppelin合约向导的另一个功能,可用于暂停合约中的多项操作,例如转账、铸造和销毁代币。这在响应安全威胁和漏洞的紧急情况下非常有用。


许可:这是OpenZeppelin合约向导的一个特性,其中的许可功能是以太坊改进提案(EIP)2612引入的特定功能。此功能允许使用签名消息以一种节省燃气的方式批准代币授权,而无需在链上进行批准交易。


闪电铸造:这是OpenZeppelin合约向导的一项功能,可以在单个交易中创建和销毁可替代代币。此概念利用了ERC20标准的能力,使得在没有预先资本的情况下执行复杂的金融策略(如套利、抵押品交换等)成为可能。


透明:这是智能合约的一部分,定义了透明代理模式(Transparent Proxy Pattern),这是一种广泛使用的使智能合约可升级的方法。它涉及部署一个代理合约,该合约将调用委托给实现合约。


可拥有:在以太坊智能合约中,“可拥有”的概念指建立所有权并提供基本访问控制机制的设计模式。


时间戳:在智能合约的上下文中,时间戳是特定的时间点。智能合约中的时间戳通常用于处理时间敏感的操作,例如投票期、锁定期或调度未来的操作。


代码示例


// SPDX-License-Identifier: MIT

// 兼容OpenZeppelin合约 ^5.0.0

pragma solidity ^0.8.20;


import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";


contract MyToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, OwnableUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable {

    /// @custom:oz-upgrades-unsafe-allow constructor

    constructor() {

        _disableInitializers();

    }

    

    function initialize(address initialOwner) initializer public {

        __ERC20_init("MyToken", "MTK");

        __ERC20Burnable_init();

        __ERC20Pausable_init();

        __Ownable_init(initialOwner);

        __ERC20Permit_init("MyToken");

        __ERC20Votes_init();

        __ERC20FlashMint_init();

    }


    function pause() public onlyOwner {

        _pause();

    }


    function unpause() public onlyOwner {

        _unpause();

    }


    function mint(address to, uint256 amount) public onlyOwner {

        _mint(to, amount);

    }


    function clock() public view override returns (uint48) {

        return uint48(block.timestamp);

    }


    // solhint-disable-next-line func-name-mixedcase

    function CLOCK_MODE() public pure override returns (string memory) {

        return "mode=timestamp";

    }


    // 以下函数是Solidity所需的重写。

    function _update(address from, address to, uint256 value)

        internal

        override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)

    {

        super._update(from, to, value);

    }


    function nonces(address owner)

        public

        view

        override(ERC20PermitUpgradeable, NoncesUpgradeable)

        returns (uint256)

    {

        return super.nonces(owner);

    }

}


以上代码是在OpenZeppelin合约向导中创建的,类型为“ERC20”。它启用了多种功能,包括投票工具、访问控制和可升级性,如可铸造、可销毁、可暂停、许可、闪电铸造、时间戳、可拥有和透明。如果您打开此代码,可以使用“REMIX-Ethereum IDE”来运行代码。


库 2. ERC721**


ERC721是一种用于以太坊区块链中非同质化代币的技术。与可同质化且彼此相同的ERC20代币不同,ERC721代币是独一无二的,彼此可区分。它代表了数字艺术、收藏品和房地产。


OpenZeppelin合约向导提供的“ERC721”的功能:


可铸造:与ERC20的解释相同。

自动增量ID:这是代币合约的一项功能,其中会自动分配新代币的增量“ID”。这通常用于需要不同标识符的每个新实体(例如代币、用户或记录)。

可销毁:与ERC20的解释相同。

可暂停:与ERC20的解释相同。

可枚举:这是代币合约的一个功能,指的是枚举链上代币的能力。这意味着智能合约包含列出所有代币或特定地址拥有的所有代币的功能。

URI存储:以太坊代币环境中的URI存储是指与代币相关的元数据(如图像、描述和其他属性)的存储和访问方式。

区块编号:这是以太坊智能合约的一项功能,指的是分配给区块链中区块的特定编号。这在链上治理中很有用,因为过去的代币余额可能会决定提案的通过。


代码示例


// SPDX-License-Identifier: MIT

// 兼容OpenZeppelin合约 ^5.0.0

pragma solidity ^0.8.20;


import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";


contract MyNFT is Initializable, ERC721Upgradeable, ERC721BurnableUpgradeable, ERC721PausableUpgradeable, OwnableUpgradeable, ERC721URIStorageUpgradeable {

    uint256 private _tokenIdCounter;


    /// @custom:oz-upgrades-unsafe-allow constructor

    constructor() {

        _disableInitializers();

    }


    function initialize(address initialOwner) initializer public {

        __ERC721_init("MyNFT", "NFT");

        __ERC721Burnable_init();

        __ERC721Pausable_init();

        __Ownable_init(initialOwner);

    }


    function pause() public onlyOwner {

        _pause();

    }


    function unpause() public onlyOwner {

        _unpause();

    }


    function mint(string memory tokenURI) public onlyOwner {

        uint256 tokenId = _tokenIdCounter++;

        _mint(msg.sender, tokenId);

        _setTokenURI(tokenId, tokenURI);

    }

}


以上代码是在OpenZeppelin合约向导中创建的,类型为“ERC721”。它启用了多种功能,包括ERC721、访问控制和可升级性,如可铸造、自动增量ID、可销毁、可暂停、可枚举和URI存储。


库 3. ERC1155**


ERC1155是一种多代币标准,支持同一合约下的同质化和非同质化代币。这使得开发人员能够在单个合约中管理多种资产。


OpenZeppelin合约向导提供的“ERC1155”的功能:


可铸造:与ERC20的解释相同。

可销毁:与ERC20的解释相同。

URI存储:与ERC721的解释相同。

安全批量转账:这是ERC1155的一项功能,它允许批量转账代币,并且在执行转账时提供了额外的安全检查。

可暂停:与ERC20的解释相同。


代码示例


// SPDX-License-Identifier: MIT

// 兼容OpenZeppelin合约 ^5.0.0

pragma solidity ^0.8.20;


import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";


contract MyMultiToken is Initializable, ERC1155Upgradeable, ERC1155BurnableUpgradeable, ERC1155PausableUpgradeable, OwnableUpgradeable {

    string public name;

    string public symbol;


    /// @custom:oz-upgrades-unsafe-allow constructor

    constructor() {

        _disableInitializers();

    }


    function initialize(string memory uri, string memory _name, string memory _symbol, address initialOwner) initializer public {

        __ERC1155_init(uri);

        __ERC1155Burnable_init();

        __ERC1155Pausable_init();

        __Ownable_init(initialOwner);

        name = _name;

        symbol = _symbol;

    }


    function pause() public onlyOwner {

        _pause();

    }


    function unpause() public onlyOwner {

        _unpause();

    }


    function mint(address account, uint256 id, uint256 amount, bytes memory data) public onlyOwner {

        _mint(account, id, amount, data);

    }


    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public onlyOwner {

        _mintBatch(to, ids, amounts, data);

    }

}


以上代码是在OpenZeppelin合约向导中创建的,类型为“ERC1155”。它启用了多种功能,包括ERC1155、访问控制和可升级性,如可铸造、可销毁、URI存储和安全批量转账。


总结


OpenZeppelin是区块链领域一个至关重要的开源组织,提供了多种工具和库,使开发人员能够安全且高效地构建去中心化应用程序。通过其智能合约库、合约向导和强大的社区支持,OpenZeppelin帮助开发人员降低了智能合约的复杂性,同时确保了它们的安全性和可升级性。

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!