v=ZurrDzuurQs Dapptools 视频 项目设置 开发环境 首先,你需要一个代码编辑器,我是VSCode[15]的忠实粉丝。...我为test_basic_fuzzing测试运行了1000条不同的路径,并找到了55这个异常值。这对于找到那些你可能没有想到的破坏合约的随机用例非常重要。...从 Openzeppelin 和外部合约导入 假设我们想使用 Openzeppelin 标准创建一个 NFT。可以使用dapp install命令安装外部合约或包。...NFT 合约 在 src 文件夹中创建一个名为 NFT.sol 的新文件。...在这个配置文件中,我们告诉它读取输出remappings.txt并将其用作“重新映射”。重新映射是我们在 solidity 中告诉导入的文件应该从哪里导入的方法。
他们的 Discord 也一直在非常迅速地回答各种问题,因此如果你遇到了问题,总是很容易寻求帮助。...它带有一个 UI,这样你就可以在 GUI 中与区块链和合约交互。看来它有一段学习曲线,我没有花足够的时间来克服障碍,但能看出它的潜力很大。...这就是为什么我想把它放在这里的原因所在,因为我觉得自己还有很多东西没能完全消化。 我希望看到有更多人能尝试这个框架并意识到它的能力。由于我在该项目上花费的时间有限,所以我觉得自己可能无法做到公正评价。...他们有一些默认选项,例如 ERC20 和 ERC721 工具,你可以在其中导入他们的合约并在几秒钟内建立一个令牌。...我敢肯定它们问世时都是很棒的工具,但是到了今天,它们不再获得支持或处于非活跃状态。下面的这些框架不值得你浪费精力去了解和尝试。
第 10 步:编写我们的合约 现在我们的环境已经设置好了,接下来是更令人兴奋的事情。编写我们的智能合约代码! 在你喜欢的编辑器(我们喜欢VSCode[22])中打开 my-nft 项目。...让我们逐行分解: 在我们的智能合约的顶部,我们导入了三个OpenZeppelin[25]智能合约类: @openzeppelin/contracts/token/ERC721/ERC721.sol 包含...在我们的导入语句之后,我们有了自定义的 NFT 智能合约,它出乎意料地短 -- 它只包含一个计数器、一个构造函数和一个函数!...当使用 hardhat-ethers 插件时,ContractFactory 和合约实例默认连接到第一个签名者。...如果我们点击进入交易,我们会在To字段下看到我们的合约地址。 在Etherscan上查看您的合约地址 耶~,你刚刚把你的 NFT 智能合约部署到了以太坊链上!
1.迁移合约状态可能代价非常大。2.当我们创建和部署新合约时,合约地址将更改。因此,我们需要更新与旧合约交互的所有合约,以使用新版本的地址。...## 编写及部署合约 现在,让我们在contracts文件夹中创建一个名为TodoList的合同。...我们可以尝试调用新合同中的getListSize()函数并检查列表的大小: ? 而已!请注意,在整个升级过程中如何保留列表的大小及其地址。...•当我们从TodoList2中获得2个项目时,这表明状态在整个更新过程中都得到保留。...如果我们的合同不兼容升级,则当尝试升级时,CLI会警告:OpenZeppelin升级库中尚未提供此功能。
NFT 智能合约 在你第一次使用 solidity 时开发一个智能合约部署在区块链上,你可能会觉得有点难。...注:下面标题序号为了读者看的更清楚所以是自己所标注的 1.2 使用 OpenZeppelin 开发 ERC721 标准的智能合约 在之前说过,本教程中,你将会使用 OpenZeppelin 去此案一个只能合约...(其实这里我不是很清楚啥意思) URI Storage 存储一个 URI 与 NFT 关联(这个需要我们传入的) 在当前教程中,你应该不想创建一个 NFT 还有一些增发、销毁、暂停、投票之类需要“经济学...首先,你可能注意到了,在 OpenZeppelin Wizard 编辑器的顶部,有一个 “Open in Remix” 的按钮: 点击按钮后将会在浏览器中打开一个新的页面。...NFT 时 使用到: 1.10 铸造你的 NFT 返回到 remix 中,在你部署的合约之下,找到对应的方法列表: 橙色方法时写入区块链的方法,蓝色方法时读取区块链内容的方法。
我们从最简单的开始,下面我们要处理一个非常普通的 token 交易,下面的代码会导入并直接使用 IERC20.sol。...0x 不会回退交易,而是返回 false,但是我们在代码中不管这个返回值。...本质上,任何人都可以与我们合约的interactWithToken交易,合约会认为成功交易了一个 token ,但实际上什么也没有做。很糟糕!...这样做的好处是,即使是像我们的第一个例子那样的代码,仍然可以安全地交易。这就是为什么 OpenZeppelin 的 ERC20 (代码[6])实现中这样做,也是我建议这样做的原因。...有一段时间,OpenZeppelin 有一个bug,他们在失败的时候回退交易,但没有在成功时返回 true(即缺少返回值)。
在 Solidity 中,都是用数据映射实现的。 第一个数据映射允许代币合约跟踪谁拥有代币。...在我们的示例中,我们将导入 OpenZeppelin 库,这个库实现了一些重要的安全检查并且容易扩展: $ npm install openzeppelin-solidity@1.12.0 + openzeppelin-solidity...当我们转移 1000 个 METoken 时,我们在调用transfer函数时指定的值是 100000 如你所见,在会话中,accounts[0]现在有 20,999,000 个 MET,accounts...在代币转移中,实际没有交易发送给代币接收者,接收者的地址只是被添加到代币合约的映射。向一个地址发送以太币的交易会改变地址状态。转移代币到一个地址的交易只会改变代币合约的状态,而不是接收者地址的状态。...只有在区块浏览器看到这些代币合约或者你的钱包查看你的地址时,你才会看到这些余额。 代币的行为方式与以太币不同。以太币是由 send 函数发送并且由合约中的 payable 函数或者外部地址接收。
3.5.2 运行 3.5.3 调试 3.5.4 设置 3.5.5 分析 3.5.6 支持 3.2 文件浏览器 文件浏览器 1)增加新文件(Create new File) 点击在浏览器上增加一个新的智能合约文件...一般操作时,调试成功的代码需要在本地文件系统新建文件保存。Remix浏览器提供了一种方法,就是使用Remixd,允许保存和同步浏览器文件到你的本地计算机中。...因为根据官网文档,笔者没有能够在Windows 10系统或者Ubuntu中安装成功Remixd,本文不再详细介绍该功能。有兴趣的朋友欢迎根据官网文档尝试使用REMIXD同步。...合约创建时,需要参考左边构建函数定义(智能合约的同名函数为构建函数)的类型来输入参数。 25....4.3 import 导入依赖编译失败 提示内容: 编译一个智能合约,有以下依赖导入代码 import "./SafeERC20.sol"; import "../..
原文链接 当使用OpenZeppelin Upgrades编写可升级合约时,有一些在编写Solidity代码时需要记住一些注意事项。...这意味着,当使用OpenZeppelin可升级的合约时,您需要将其构造函数改为一个常规函数,通常命名为initialize,在那里执行所有的初始化逻辑。...constructor在合约的生命周期内只被调用一次,但一个普通函数可以被多次调用。...避免在字段声明中使用初始值 Solidity允许在合约中声明字段时为其定义初始值。...= 42; // define as constant } 从合约代码中创建新实例 当从合约代码中创建一个新的合约实例时,这些创建直接由Solidity处理,而不是由OpenZeppelin Upgrades
此外,在2020年和2021年,我们看到了无数的闪电贷攻击[23]、预言机操纵攻击等黑客行为[24],在Defi领域造成了近数十亿 美元的损失。...Openzeppelin是一套已经写好的智能合约,所以你不需要重新发明轮子。我在项目中使用他们已经审计过的可扩展智能合约,为我节省了无数的时间。我无法强调Openzeppelin是多么的重要。...我想在我大约80%的教程中,我都在以某种方式使用Openzeppelin。 智能合约要点总结 必须知道的 :Chainlink和Openzeppelin 你可以(而且可能应该)同时使用这两个东西。...Remix是一个我认为每个人在开始时候都应该使用的工具,这样每个人在尝试分享想法时都可以有一个共同认知。...有时,我会在讨论区中加入我的问题的链接,以吸引更多的人关注它。但一个经验法则是,当我遇到问题时,Stackoverflow或Stack Exchange ETH应该是我最先寻找的地方之一。
使用升级插件来升级合约 使用OpenZeppelin升级插件中的deployProxy部署一个新的合约时,该合约实例就可以实现可升级的功能。默认情况下,只有最初部署合约的地址才有权限执行升级操作。...我们的Box实例已经升级到了最新版本的代码,同时保持了它的状态和之前的地址。我们不需要在新的地址部署一个新的合约,也不需要手动将旧Box的value复制到新Box中。...通过调用新的increment函数来尝试一下,并在检查value值。 需要指定我们部署Box合约时的代理合约地址。...当创建一个新的可升级合约实例时,OpenZeppelin升级插件实际上部署了三个合约。 你写的合约,也就是所谓的包含逻辑的合约实现。 一个ProxyAdmin,作为代理的管理员。...这意味着,如果你已经在合约中声明了一个状态变量,你就不能删除它,不能改变它的类型,也不能在它之前声明其他变量。在我们的Box例子中,这意味着我们只能在value之后添加新的状态变量。
这是由于v0.4.5中引入的一个编译器错误,在v0.6.8中得到了修复。...当使用 ABIEncoderV2 时,包含动态大小数组的结构体或数组的合约构造函数会回退或解码为无效数据。这是由于在v0.4.16中引入的编译器错误,在v0.5.9中得到了修正。...当在外部函数调用中或在abi.encode()中直接编码时,包含结构体或其他静态大小数组的存储数组无法正确读取。这是由于v0.4.16中引入的一个编译器错误,并在v0.5.10中得到了修复。...这是由于v0.6.9中引入的一个编译器错误,在v0.6.10中得到了修复。(参见这里[123]) 自由函数的重新定义。...当在一个源代码单元中定义了两个或更多具有相同名称和参数类型的自由函数(合约之外的函数)时,或当一个导入的自由函数别名覆盖了另一个名称不同但参数类型相同的自由函数时,编译器没有标记错误。
因此,在本教程中,我们将编写一个智能合约,允许任何人通过支付 Gas 从我们的藏品中铸造一个 NFT。...编写智能合约 在这一节中,我们将在Solidity[12]中编写一个智能合约,允许任何人通过支付所需数量的以太币+Gas 来铸造一定数量的 NFT。...在本教程中,我们将把 1-3 设置为常数。换句话说,一旦合约被部署,我们将无法修改它们。我们将为baseTokenURI编写一个 setter 函数,允许合约的所有者(或部署者)在需要时修改它。...当我们把这个设置为baseTokenURI时,OpenZeppelin 的实现会自动推导出每个 token 的 URI。...一个明显的下一步是建立一个 web3 应用程序,让我们的用户可以直接从我们的网站上铸造 NFT。这将是另一个教程[19]的主题。 如果你已经走到了这一步,恭喜你!
/fjun99/web3app-tutorial-using-ethers 特别感谢在准备 webapp 代码库时,Wesley 的Proof-of-Competence, POC[4]项目学到了很多。...尝试运行合约部署到进程中的 Hardhat Network 本地测试网(进程中模式)。...当我们刷新页面时,没有当前账户,也没有显示余额。在我们连接钱包后,余额被查询到并显示在页面上。...我们可以在 Node.js webapp 中监听这个事件并更新页面显示。 任务 6.1: 了解智能合约事件 简单解释事件:当我们调用会智能合约的状态变化函数时,有三个步骤: 第 1 步:链外调用。...当监听到一个事件时,查询 currentAccount 的 token 余额并更新页面。 你可以在页面上或在 MetaMask 中从当前账户转账,你会看到页面在事件发生时正在更新。
用于 VSCode 的 Azure 开发套件[47] -VSCode 扩展,方便在 Visual Studio Code 中创建智能合约并进行部署 测试区块链网络 ethnode[48] -运行以太坊节点...EthContract[106] -一组帮助在 Elixir 中查询智能合约的帮助方法 MESG[107] -MESG 服务,可根据其地址和 ABI 与任何以太坊合约进行交互。...npm 软件包,在 Truffle 中测试 Solidity 智能合约。...对于可视化导入的合约或在 Etherscan 上验证合约很有用 Sol-merger[230] - 将所有导入合并到单个文件中(替代方案) RLP[231] - JavaScript 中的递归长度前缀编码...Typescript 绑定 EthSum[240] - 一个简单的以太坊地址校验和工具 PHP based Blockchain indexer[241] - 在 PHP 中索引块或侦听的事件 Web3Model
Cryptotux - 准备在 VirtualBox 中导入的 Linux 映像,包括上面提到的开发工具 OpenZeppelin Starter Kits - 一个多合一的入门盒,供开发人员快速启动他们的智能合约支持的应用程序...0xcert - 用于构建去中心化应用程序的 JavaScript 框架 OpenZeppelin SDK - OpenZeppelin SDK:一套工具,可帮助您开发、编译、升级、部署和与智能合约交互...Cobra - 一个快速、灵活和简单的以太坊智能合约开发环境框架,在以太坊虚拟机(EVM)上测试和部署。 Epirus - 用于构建智能合约的 Java 框架。...Azure Blockchain Dev Kit for Ethereum for VSCode - VSCode 扩展,允许创建智能合约并将其部署在 Visual Studio Code 中 测试区块链网络...好处包括微小的构建和完整的类型安全,包括与合同交互时。
self, "UUPSUpgradeable: must not be called through delegatecall"); _; } // 注意这里的notDelegated,这个函数是在升级时父类...合约升级上,openzeppelin 的 mocks 里,有一个实现,可以校验升级的合约是否可回滚。...因为普通用户就直接在代理合约判断ifAdmin的时候就转到了逻辑合约里,而管理合约的调用,就会放行到代理合约直接执行。 管理合约 仅仅是回调参数传过来的 proxy 的同名函数。...Beacon 以上两种代理,都存在一种缺陷,就是如果我要升级一批具有相同逻辑合约的代理合约,那么需要在每个代理合约都执行一遍升级(因为每个代理合约独立存储了_implementation)。...信标合约,就是将所有的具有相同逻辑合约的代理合约的_implementation 只存一份在信标合约中,所有的代理合约通过和信标合约接口调用,获取_implementation,这样,在升级的时候,就可以只升级信标合约
因此,在我们的可升级智能合约方案中,当用户调用代理合约时,会调用回退函数,然后使用代理合约中的数据“委托”对逻辑合约中定义的方法的调用。...有关详细示例,我建议您阅读OpenZeplin 关于可升级智能合约的文档的这一页(https://docs.openzeppelin.com/learn/upgrading-smart-contracts...假设用户调用代理合约,然后调用逻辑合约。逻辑合约执行函数并将数据写回代理合约。到现在为止还挺好。 这就是它变得棘手的地方: 当逻辑合约尝试写入代理合约时,它会在代理状态的范围内这样做。...我们使用以下变量定义了代理和逻辑合约。 代理将逻辑合约的地址存储在第一个存储槽中。逻辑合约将“所有者”的地址存储在其第一个槽中。两个变量的大小均为 32 字节。...如果逻辑合约被执行并写入“所有者”变量,它将在代理合约的上下文中执行。这意味着它会尝试写入代理合约的第一个存储槽。这将导致存储冲突。
智能合约的存储是在合约构建过程中(在合约被部署时)预置的。这意味着合约存储的布局在合约创建时就已经确定了。该布局是基于你的合约级变量声明而 "成型 "的,并且这种布局不能被未来的方法调用所改变。...存储槽中的第一个项目被低阶对齐存储 因此,当变量小于 32 字节时,Solidity 尝试将一个以上的变量打包到一个存储槽中,如果它们能被容纳的话。因此,一个存储槽可以容纳一个以上的状态变量。...我们还可以看到,这两个值在通过interpreter.evm.StateDB.SetState(...)写入合约存储时,都将从栈中取出的两个项目转换为bytes32值。...在函数体中的存储指针 当变量为基本类型时,将存储变量赋值给局部变量(在函数体中定义的)总是复制。 然而,对于复杂或动态类型,规则有所不同。...每一行都写到了合约存储区。 一旦函数被执行,新的 Proposal(提案)将被保存在合约存储中,并且这些变化将持续存在。 在存储引用的底层发生了什么? 看一下下面的例子,类似的治理主题。
如果我今天要开始一个新的项目,我一定会用 Foundry 来尝试。 感谢devtooligan[5]提供的图片。 所以我们来实现一个 ERC-20 并写一些测试。...或者使用我创建的模板,其中包含本帖中所有的示例代码,见最后的说明。 3. 实现一个 ERC-20 现在让我们创建一个 ERC-20 合约,并对其进行一些测试。.../contracts/ 现在使用 Openzeppelin 合约来创建一个新的合约,只要把现有的文件重命名为MyERC20.sol: // SPDX-License-Identifier: MIT pragma...创建一个测试基础设置 现在在文件MyErc20.t.sol中,我们可以创建一个基础设置(Setup)。在 foundry 中,有一个setUp函数,可以定义它来使合约进入不同的状态并创建一些地址。...除了 ERC20 合约本身,我们还将从 forge-std、ds-test 和 utils 导入一些东西。
领取专属 10元无门槛券
手把手带您无忧上云