如何使用Alchemy开发NFT智能合约(ERC721)

news2024/11/23 0:33:53

使用Solidity开发智能合约并在区块链上部署可能一开始听起来有些吓人:Solidity、安全性、gas优化、开发环境和gas费用,这些只是你需要了解的一些事情,才能让你的代码托管在区块链上。不用担心,我们来帮你梳理一下。

不过,幸运的是,在过去几个月中,已经发布了许多工具,让开发人员可以更轻松地进行智能合约开发工作。

像OpenZeppelin Wizard这样的工具,为开发人员提供了点击和编写功能,可以在短时间内创建可组合和安全的智能合约,再加上Web3开发人员工具Alchemy的支持,让编写和部署区块链上的代码的体验变得比以往任何时候都更容易、更快速、更可靠。

在本教程中,您将学习如何使用Alchemy、OpenZeppelin、Remix和Ethereum Goerli开发和部署ERC721(NFT)智能合约。

更具体地说,您将学习:

  • 如何使用OpenZeppelin和Remix编写和修改智能合约
  • 使用 https://goerlifaucet.com/获取免费的Goerli ETH
  • 将其部署在Ethereum Goerli测试网络区块链上以节省gas费用
  • 使用Filebase在IPFS上托管NFT令牌元数据。
  • 铸造NFT并在OpenSea上可视化。

您也可以跟随视频教程:

让我们开始创建智能合约。

使用OpenZeppelin合约向导开发ERC721智能合约。

如前所述,在本教程中,您将使用OpenZeppelin向导创建智能合约,有两个主要原因:

  • 它是安全的。
  • 它提供标准的智能合约。

当涉及编写智能合约时,安全性至关重要。有许多智能合约漏洞的例子,由于安全性不佳而导致恶意行为者窃取了数亿美元。

你不想在部署到区块链上后有人窃取你所有宝贵的加密货币或NFT吧?

OpenZeppelin服务于此目的,是最大的智能合约标准维护者之一(ERC20、ERC721等),允许开发人员使用经过全面审核的代码来开发可靠的合约。

要开发我们的ERC721 NFT智能合约,您需要做的第一件事是进入Open Zeppelin智能合约向导页面。

进入页面后,您将看到以下编辑器:

https://files.readme.io/9e820fe-erc721.png
https://files.readme.io/9e820fe-erc721.png

点击左上角的ERC721按钮,选择要使用的ERC标准类型和要编写的合约类型:

https://files.readme.io/828ee6a-Erc721_2.png
https://files.readme.io/828ee6a-Erc721_2.png

现在您已经选择了合约标准,在左侧菜单中应该会看到一些选项:

让我们从选择代币的名称和符号开始。单击文本框中的“MyToken”,给它命名,然后用同样的方式设置符号,并将基础URI字段留空(代币名称将被OpenSea和Rarible用作集合名称)。

https://files.readme.io/7c6e435-Alh_set.png
https://files.readme.io/7c6e435-Alh_set.png

选择NFT(ERC721)代币功能

现在您需要选择要集成到我们的智能合约中的功能,在“设置”部分之后,您将找到“功能”部分,在那里您将能够选择要包括在您的智能合约中的不同模块。

https://files.readme.io/acaa48a-Miint.png
https://files.readme.io/acaa48a-Miint.png

在这种情况下,您将选择以下集成:

  • Mintable将创建一个仅特权账户可调用的铸造功能
  • Auto Increment IDs将自动为您的NFT分配递增的ID
  • Enumerable将为您提供访问链上代币枚举和“totalSupply”等函数的功能,这些功能在默认的ERC721集成URI存储中不存在,以将元数据和图像与您的每个NFT相关联
  • URI Storage以能够将URI与我们的NFT相关联
https://files.readme.io/d4a7d1d-Screenshot_2022-05-01_at_17.20.48.png
https://files.readme.io/d4a7d1d-Screenshot_2022-05-01_at_17.20.48.png

为了本教程的目的,我们建议您不要勾选以下模块,以确保我们的NFT不受到任何类型的Tokenomic影响:

  • 可销毁的 - 用于销毁代币
  • 可暂停的 - 用于暂停代币转移、销售等
  • 投票 - 提供类似于代表和投票的治理功能

如果您想了解更多关于这些模块的信息,请查看官方OpenZeppelin ERC721标准文档。

现在,您已经选择了所需的功能,OpenZeppelin向导将填充智能合约的代码,它应该如下所示:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    constructor() ERC721("Alchemy", "ALC") {}

    function safeMint(address to, uint256 tokenId, string memory uri)
        public
        onlyOwner
    {
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

是时候将我们的代码复制并带到 Remix IDE 上进行修改,并在区块链上部署它了。

使用REMIX IDE修改和部署您的ERC721合约

现在您已经拥有了ERC721智能合约,让我们在Goerli Testnet上修改并部署它。为此,您将使用Remix IDE,这是一个专门为Solidity智能合约开发而设计的免费Web集成开发环境。

首先,正如您可能已经注意到的那样,在OpenZeppelin Wizard编辑器的顶部,有一个“在Remix中打开”的按钮:

https://files.readme.io/108c79e-Remix.png
https://files.readme.io/108c79e-Remix.png

点击它将在浏览器的新标签页中打开 REMIX IDE。

使用Remix修改NFT智能合约

从合同的顶部开始,有一个“SPDX-License-Identifier”,它指定了您的代码将发布的许可证类型 - 在Web3应用程序中保持代码开源是一个好习惯,因为它将确保可信度。

// SPDX-License-Identifier: MIT

然后有 pragma - 编译器的版本,您将使用它来编译智能合约代码。小的 “^” 符号告诉编译器,0.8.0 到 0.8.9 之间的每个版本都适合编译我们的代码。

pragma solidity ^0.8.4;

然后我们导入一堆库并初始化智能合约。

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

然后我们初始化合约,继承我们从OpenZeppelin代码库中导入的所有标准:

contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {...}

正如您所注意到的,safeMint函数具有“onlyOwner”修饰符 - 这将仅允许智能合约的所有者(部署智能合约的钱包地址)铸造NFT。您可能希望任何人都可以铸造NFT,为此,您需要从Mint函数中删除onlyOwner修饰符。

function safeMint(address to, string memory uri) public {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

你也可以从合约声明 "Ownable" 和库导入中删除它

import "@openzeppelin/contracts/access/Ownable.sol";

现在每个人都可以铸造我们的NFT,你需要避免其他人铸造的NFT数量超过我们收藏中的最大数量。为此,让我们指定可铸造的NFT的最大数量。

假设用户想要铸造总共10,000个NFT。为此,让我们创建一个新的uint256变量,称其为MAX_SUPPLY,并将其赋值为10,000。

Counters.Counter private _tokenIdCounter;
    uint256 MAX_SUPPLY = 100000;

    constructor() ERC721("Alchemy", "ALCH") {}

接下来,让我们进入safeMint函数并在第18行添加一个require语句:

require(_tokenIdCounter.current() <= MAX_SUPPLY, "I'm sorry we reached the cap");

让我们花点时间更好地了解Solidity中的“require”语句。

您可以在官方文档中阅读有关Solidity “require”语句的更多信息。

现在,您已经限制了NFT的最大供应量,是时候在Goerli测试网络上编译智能合约并部署它了。为此,您需要在Alchemy.com上创建一个免费帐户,将其添加为Metamask的节点提供程序,并获取一些免费的Goerli ETH。

创建免费的Alchemy帐户

首先,让我们导航到alchemy.com,单击“登录”并创建一个新帐户:

https://files.readme.io/56d3600-web3_eco.png
https://files.readme.io/56d3600-web3_eco.png

选择以太坊生态系统:

https://files.readme.io/7719099-ether_eco.png
https://files.readme.io/7719099-ether_eco.png

给您的应用程序和团队取一个名称,选择Goerli网络,然后点击创建应用程序:

*Create App*
*Create App*

Create App

完成流程后,我们将被重定向到仪表板页面。点击您选择的应用程序名称,“test”在这种情况下,点击右上角的“查看密钥”按钮,然后复制HTTP URL:

*Your Application Details*
*Your Application Details*

Your Application Details

接下来,您需要将Alchemy添加到Metamask作为Goerli RPC提供程序。如果您尚未安装Metamask,请确保按照此指南将其添加到您的浏览器并创建一个新钱包。

将Alchemy Goerli添加到您的Metamask钱包

一旦安装Metamask,点击网络下拉菜单,然后点击“添加网络”!

https://files.readme.io/af70d3f-Screen_Shot_2022-09-22_at_1.28.09_PM.png
https://files.readme.io/af70d3f-Screen_Shot_2022-09-22_at_1.28.09_PM.png

您将被重定向到以下页面,在该页面上您需要填写Goerli网络和RPC URL信息。

*Fill in the Goerli Network and RPC Url*
*Fill in the Goerli Network and RPC Url*

Fill in the Goerli Network and RPC Url

在表格中添加以下信息:

  • Network name:Alchemy Goerli
  • New RPC URL: Goerli Alchemy应用程序的HTTP URL
  • Chain ID:5
  • Currency Symbol:GoerliETH
  • Block Explorer: https://goerli.etherscan.io

太棒了,你使用Alchemy将Goerli添加到了Metamask!🎉

现在是时候在Goerli上部署我们的智能合约了,但首先,你需要获得一些Goerli测试ETH。

获取免费Goerli测试ETH

获取Goerli测试ETH非常简单,只需前往 goerlifaucet.com,将钱包地址复制到文本栏中,然后点击“发送ETH给我”:

https://files.readme.io/f3d2940-goe.png
https://files.readme.io/f3d2940-goe.png

在10-20秒后,您将在Metamask钱包中看到Goerli ETH。

您每24小时可以无需登录获得高达0.1 ETH,或者使用Alchemy账户可获得0.5 ETH。

现在您已经获得了测试ETH,是时候在区块链上编译和部署我们的NFT智能合约了。

在Goerli测试网络上编译和部署NFT智能合约

回到Remix,让我们点击页面左侧的编译器菜单,然后点击蓝色的“编译”按钮:

https://files.readme.io/c0c058f-solid_compiler.png
https://files.readme.io/c0c058f-solid_compiler.png

然后点击“部署和运行交易”菜单,点击环境下拉菜单,并选择“注入Web3”:

确保Metamask钱包在Alchemy Goerli网络上,从合同下拉菜单中选择NFT智能合约,然后点击部署。

https://files.readme.io/e249393-dep.png
https://files.readme.io/e249393-dep.png

一个 Metamask 弹出窗口将出现,点击 "sign",然后继续支付燃气费。

如果一切按预期工作,10 秒后你应该可以在 "已部署的合约" 下看到合约列表:

https://files.readme.io/6630f89-deployed_contracts.png
https://files.readme.io/6630f89-deployed_contracts.png

现在智能合约已经部署到Goerli测试网,是时候铸造我们的NFT了,但首先需要在IPFS上创建并上传元数据,让我们了解一下“元数据”这个术语的含义。

什么是NFT元数据?

https://files.readme.io/8a5f1ab-octopus.png
https://files.readme.io/8a5f1ab-octopus.png

为了使OpenSea拉取ERC721代币的离线元数据,合约需要返回指向托管元数据的URI。为了找到这个URI,OpenSea、Rarible和其他流行的市场将使用ERC721Uristorage标准中包含的tokenURI方法。

ERC721中的tokenURI函数应返回HTTP或IPFS URL,例如ipfs://bafkreig4rdq3nvyg2yra5x363gdo4xtbcfjlhshw63we7vtlldyyvwagbq。当查询时,此URL应返回包含代币元数据的JSON blob数据。

您可以在官方OpenSea文档中阅读有关元数据标准的更多信息。

如何格式化您的NFT元数据

根据OpenSea文档,NFT元数据应存储在.json文件中,并按以下结构进行组织:


  "description""YOUR DESCRIPTION",
  "external_url""YOUR URL",
  "image""IMAGE URL",
  "name""TITLE"
  "attributes": [
    {
      "trait_type""Base"
      "value""Starfish"
    }, 
    {
      "trait_type""Eyes"
      "value""Big"
    }, 
    {
      "trait_type""Mouth"
      "value""Surprised"
    }, 
    {
      "trait_type""Level"
      "value"5
    }, 
    {
      "trait_type""Stamina"
      "value"1.4
    }, 
    {
      "trait_type""Personality"
      "value""Sad"
    }, 
    {
      "display_type""boost_number"
      "trait_type""Aqua Power"
      "value"40
    }, 
    {
      "display_type""boost_percentage"
      "trait_type""Stamina Increase"
      "value"10
    }, 
    {
      "display_type""number"
      "trait_type""Generation"
      "value"2
    }]
  }

这里是每个属性存储的简要说明:

属性说明
image该物品图片的 URL。可以是任何类型的图片(包括 SVG,OpenSea 会将其缓存为 PNG),可以是 IPFS URL 或路径。建议使用 350 x 350 的图片。
image_data如果您想要动态生成图片,则可以使用原始的 SVG 图片数据(不建议使用)。只有在不包含 image 参数时才使用此选项。
external_url该链接将出现在 OpenSea 网站上该资产图片下方,用户可以通过该链接离开 OpenSea,在您的网站上查看该资产。
description该物品的人类可读描述。支持 Markdown。
name该物品的名称。
attributes这些是该物品的属性,将出现在 OpenSea 网站上对该物品的页面上。(见下文)
background_color该物品在 OpenSea 上的背景颜色。必须是六位数的十六进制码,不带前导符号。
animation_url一个指向该物品多媒体附件的 URL。支持的文件扩展名有 GLTF、GLB、WEBM、MP4、M4V、OGV、OGG 和仅音频的扩展名 MP3、WAV、OGA。animation_url 还支持 HTML 页面,允许我们使用 JavaScript 画布、WebGL 等构建丰富的体验和交互式 NFT。现在支持 HTML 页面内的脚本和相对路径。但是,不支持浏览器扩展访问。
youtube_url一个指向 YouTube 视频的 URL。

现在我们已经简要了解了令牌元数据中将包含什么内容,让我们学习如何创建它并将其存储在IPFS上。

创建并上传IPFS上的元数据

首先,前往 [filebase.com](https://filebase.com/) 并创建一个新账户。

登录后,点击左侧菜单中的桶按钮,然后创建一个新桶:

https://files.readme.io/73f3bad-filebase.png
https://files.readme.io/73f3bad-filebase.png

进入存储桶,点击 上传按钮,上传你想用于 NFT 的图片,我会使用以下图片。

上传后,点击它并复制 IPFS 网关 URL:

https://files.readme.io/5bd8524-ipfs.png
https://files.readme.io/5bd8524-ipfs.png

使用任何文本编辑器,粘贴以下JSON代码:


  "description""This NFT proves I've created and deployed my first ERC20 smart contract on Goerli with Alchemy Road to Web3",
  "external_url""Alchemy.com/?a=roadtoweb3weekone",
  "image""https://ipfs.filebase.io/ipfs/bafybeihyvhgbcov2nmvbnveunoodokme5eb42uekrqowxdennt2qyeculm",
  "name""A cool NFT"
  "attributes": [
    {
      "trait_type""Base"
      "value""Starfish"
    }, 
    {
      "trait_type""Eyes"
      "value""Big"
    }, 
    {
      "trait_type""Mouth"
      "value""Surprised"
    }, 
    {
      "trait_type""Level"
      "value"5
    }, 
    {
      "trait_type""Stamina"
      "value"1.4
    }, 
    {
      "trait_type""Personality"
      "value""Sad"
    }, 
    {
      "display_type""boost_number"
      "trait_type""Aqua Power"
      "value"40
    }, 
    {
      "display_type""boost_percentage"
      "trait_type""Stamina Increase"
      "value"10
    }, 
    {
      "display_type""number"
      "trait_type""Generation"
      "value"2
    }]
  }

并将文件另存为“metadata.json”。返回Filebase,将“metadata.json”文件上传到与我们上传图片相同的存储桶中。

https://files.readme.io/6ecc402-metadata.png
https://files.readme.io/6ecc402-metadata.png

最后,点击CID并复制它,在下一部分中我们需要它来构建令牌URI以便铸造NFT:

https://img-blog.csdnimg.cn/img_convert/efe0bca29baba30c82805800a40aba77.png
https://img-blog.csdnimg.cn/img_convert/efe0bca29baba30c82805800a40aba77.png

铸造你的Goerli NFT

回到Remix,在“Deploy & Run Transactions”菜单下,进入“deployed contracts”,然后点击刚刚部署的合约,在打开的列表中,你会看到智能合约中包含的所有方法:

https://img-blog.csdnimg.cn/img_convert/a325d757b703b79e6fc2e4f394ff9f63.png
https://img-blog.csdnimg.cn/img_convert/a325d757b703b79e6fc2e4f394ff9f63.png

橙色方法是实际写入区块链的方法,而蓝色方法是从区块链中学习的方法。

单击safeMint方法下拉图标,粘贴您的地址和以下字符串到uri字段中:

ipfs://\\<your\\_metadata\\_cid>

单击转账将创建一个Metamask弹出窗口,提示您支付燃气费用。

点击“签名”并继续铸造您的第一个NFT!

等待几秒钟,为确保铸造成功,请将您的地址复制并粘贴到balanceOf方法输入中,并运行它 - 它应该显示您拥有1个NFT。

对于tokenUri方法,请使用“0”作为id参数进行相同操作,它应该显示您的tokenURI。

太棒了!您刚刚铸造了您的第一个NFT!🎉

现在是时候转移到OpenSea,检查元数据是否开始读取了。

在OpenSea上可视化您的NFT

前往 testnets.opensea.io,使用您的Metamask钱包登录。然后点击您的个人资料图片,您应该会看到您新铸造的NFT。如果图片还没有显示出来,请点击它,然后点击“刷新元数据”按钮。

https://files.readme.io/3256828-testnet.png
https://files.readme.io/3256828-testnet.png

有时候OpenSea很难识别测试网的元数据 - 可能需要长达6个小时才能看到。一段时间后,您的NFT应该会像这样显示:(https://testnets.opensea.io/assets/mumbai/0x5a411430964664412e69cff1134759f6bb57c5d7/1)。

https://files.readme.io/b36cf81-erc_testnet.png
https://files.readme.io/b36cf81-erc_testnet.png

恭喜你成功地创建、修改并部署了你的第一个智能合约。铸造了你的第一个NFT并将你的图像发布到了IPFS上!🔥

下一步呢?为什么不修改你的智能合约,让用户只能铸造一定数量的NFT呢?每个用户只能铸造5个就足够了,否则有人可能会开始铸造成千上万的NFT!

为了做到这一点,请看一下映射类型,这里有一个神奇的指南,可以帮助你完成。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解

2022 第十三届蓝桥杯大赛软件赛决赛, 国赛&#xff0c;C/C 大学B组题解 文章目录 第1题 —— 2022 &#xff08;5分&#xff09;第2题 —— 钟表 &#xff08;5分&#xff09;第3题 —— 卡牌 &#xff08;10分&#xff09;第4题 —— 最大数字 &#xff08;10分&#xff09;第…

bbys_tu_2016

1,三连 思路&#xff1a;栈溢出 2&#xff0c;IDA分析 利用函数&#xff1a; 思路:ret2text 偏移&#xff1a;24 3&#xff0c;payload from pwn import * context.log_level"debug"rremote(node4.buuoj.cn,29195)flag 0x804856Dpayload 24 * a p32(flag) r.se…

Unittest单元测试框架之unittest构建测试套件

构建测试套件 在实际项目中&#xff0c;随着项目进度的开展&#xff0c;测试类会越来越多&#xff0c;可是直到现在我 们还只会一个一个的单独运行测试类&#xff0c;这在实际项目实践中肯定是不可行的&#xff0c;在 unittest中可以通过测试套件来解决该问题。 测试套件&…

七、Zookeeper注册中心

目录 1、下载Zookeeper的服务jar包 2、下载好jar包后解压放到合适的目录&#xff08;目录最好不要有中文及空格&#xff09; 3、进入解压后的conf目录&#xff0c;复制zoo_sample.cfg文件并重命名为zoo.cfg&#xff0c;修改zoo.cfg文件内容如下 4、运行bin目录下的zkServer…

split,paste,eval命令及正则表达式

一、split命令 将 linux 下的一个大文件拆分成若干小文件 1.语法格式 格式&#xff1a;split 选项 参数 原始文件 拆分后文件名前缀 常用选项: -l&#xff1a;以行数拆分 -b&#xff1a;以大小拆分 2.命令演示 2.1选项 -l &#xff1a;以行数分隔 cat -n anaconda-ks.cfg…

Windows系统安装好MongoDB后运行方法

文章目录 1、先找到安装MongoDB的文件位置的bin文件夹&#xff1a;2、找到data/db文件夹位置&#xff08;如果data文件夹中没有db文件夹需要创建一个&#xff09;&#xff1a;3、在刚刚打开的cmd窗口中运行以下命令&#xff1a;4、再另外从bin文件夹位置开一个cmd窗口&#xff…

图书管理系统(Java简单版)(完整代码+详解)

目录 详解&#xff1a; BookList类&#xff1a; InOperation接口 User类&#xff08;父类&#xff09; 和 Main类&#xff08;这俩要一起看&#xff09; 完整代码 book包 Book类 BookList类 operation包 AddBook类 BorrowBook类 DeleteBook类 FindBook类 Pr…

ESP32 FreeRTOS学习总结

2023.5.11 1.Task 创建任务常用API&#xff1a; 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreatePinnedToCore指定任务的运行核心(最后一个参数)vTaskDelete(NULL)删除当前任务 BaseType_t xTaskCreate(TaskFunction_t pxTaskCode, // 任…

【HBase】架构

文章目录 整体架构Master负载均衡器元数据管理器预写日志处理器 Region ServerZookeeperHDFS Master架构Meta 表格 RegionServer 架构MemStoreWALBlockCache 读写流程HFile结构写流程读操作 整体架构 Master 实现类为 HMaster。 负责监控集群中所有的 RegionServer 实例。 &…

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780 操作系统是64位的Fedora-Workstation-Live-x86_64-36-1.5.iso&#xff0c;实物打印机是佳能ip2780&#xff0c;USB接口 应用程序——其它——设置——打印机——解锁——输入root密码——将打印机USB插入电…

Redis数据结构——动态字符串、Dict、ZipList

一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度…

智慧产业城彰显中国智造魅力,中联重科踏出“走上去”的关键一步

5月11日至14日&#xff0c;中联重科在长沙举行了“科技献礼新时代”系列活动。 借着活动&#xff0c;松果财经实地探访了全球规模最大、品种最全的工程机械产业基地&#xff0c;领略了前沿技术赋能先进制造的魅力。 作为湖南省“一号工程”和“十大重点项目之首”&#xff0c…

好家伙,又一份牛逼笔记面世了...

最近网传的一些裁员的消息&#xff0c;搞的人心惶惶。已经拿到大厂offer的码友来问我&#xff1a;大厂还能去&#xff0c;去了会不会被裁。 还在学习的网友来问我&#xff1a;现在还要冲互联网么&#xff1f; 我是认为大家不用恐慌吧&#xff0c;该看啥看啥&#xff0c;该学啥…

你一定要知道的unittest自动化测试框架详解

目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式&#xff1a; unittest构建测试套件&#xff08;测试用例集合&#xff09;&#xff1a; unittest忽略测试用例&#xff1a; 运行测试集 批量执行测试用例 生成HTMLTestRunner测试报告…

【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)

本篇文章介绍下Nginx有关内容&#xff0c;Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。 开源&#xff1a;直接获取源代码&#xff0c;高性能&#xff1a;支持海量并发&#xff0c;可靠&#xff1a;服务稳定 Web服务有很多&#xff0c;选择Nginx是因为他的轻量化…

【软件测试】测试开发的一生之敌-BUG

文章目录 1.前言2.如何描述/创建一个BUG3.BUG的级别4.BUG的生命周期5.跟开发产生争执怎么办 1.前言 BUG相比大家都知道,程序运行出错或者与预期不符就是BUG.现在我们来用测试人员的角度来看待BUG. 2.如何描述/创建一个BUG 测试人员要测试开发人员的代码,找出开发人员可能忽略…

敏态开发在大兴机场数字化转型中的实践

一、最大事业是育人 大兴机场是一个年轻的企业&#xff0c;作为一个企业来讲&#xff0c;最宝贵的就是人才。我们在2017年开始社招大学生&#xff0c;到目前为止&#xff0c;公司有一半都是30岁左右的年轻人&#xff0c;并且每年都会招几十个。年轻人特别想做事&#xff0c;而…

C++之内存管理及函数模版

C中的内存管理机制和C语言是一样的&#xff0c;但在具体内存管理函数上&#xff0c;C语言的malloc已经无法满足C面向对象销毁的需求&#xff0c;于是祖师爷在C中新增了一系列内存管理函数&#xff0c;即 new 和 delete 著名段子&#xff1a;如果你还没没有对象&#xff0c;那就…

( 位运算 ) 342. 4的幂 ——【Leetcode每日一题】

❓342. 4的幂 难度&#xff1a;简单 给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4 x n 4^x n4x。 示例 1&…