无题
{"name":"tool06_hardhat","version":"1.0.0","lockfileVersion":2,"requires":true,"packages":{"":{"name":"tool06_hardhat","version":"1.0.0","license":"ISC","devDependencies":{"@nomicfoundation/hardhat-toolbox":"^4.0.0","hardhat":"^2.22.2"}},"node_modules/@adraffy/ens-normalize":{"version":"1.10.1","resolved":"https://registry.npmmirror.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz","integrity":"sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", ...
无题
WTF Solidity教程学习笔记
社区成员可以在这个专题下发表WTF Solidity教程学习笔记。
每份笔记都要在这个目录下新建一个文件夹。
命名规则
文件夹名:以Notes起始,后面跟第几讲,最后跟你的Github id或昵称,例如:Notes_01_HelloWeb3_0xAA。如果是总结性质的笔记,则可省去某一讲的名字,并在名字中加上Summary,例如:Notes_Summary_0xAA
图片存放:在你新建的笔记文件夹下新建个img文件夹,图片放在里面,例如:Notes_01_HelloWeb3_0xAA/img/1.png。
笔记存放:存放在你新建的笔记文件夹下面的readme.md中。
笔记要求
可读性好。
原创,非抄袭。
无题
ERC721
ERC-721 提供了代表单一资产的唯一标示符到地址的映射,由 Dapper labs Dieter Shirley 创造出来并由 CryptoKitties 带向市场。
ERC721合约的主要构成
3个库合约:Address.sol, Context.sol和Strings.sol
3个接口合约:IERC721.sol, IERC721Receiver.sol, IERC721Metadata.sol
1个EIP165合约:ERC165.sol
本文内容参照了A大关于Solidity的学习笔记文章,教程内容由社区成员创作完善而成,每个知识点后面都结合具体的例子,Github1.9K⭐︎。目前还在不断完善中,欢迎大家一起完善。文章仓库链接:
https://github.com/AmazingAng/WTF-Solidity
同时也参照了@崔棉大师关于Solidity的教学资源,B站链接:
崔棉大师的个人空间_哔哩哔哩_Bilibili
ERC-721的依赖项
合约名字
合约类型
链接
描述
Address.sol
标准库
https://g ...
无题
setApprovalForAll()的实例
ERC721 标准合约是没有提供批量转移NFT到不同的地址中的接口,如果项目方想给白名单用户空投,代理合约配合setApprovalForAll()函数提供了一种解决方案。
关于接口合约的基础介绍:
Solidity8.0全面精通-42-接口合约_哔哩哔哩_bilibili
关于空投的原理可以参考以下两个视频
https://www.youtube.com/watch?v=-0nU2usv4S4&t=2s
https://www.youtube.com/watch?v=M7ThuAS47Cc
空投用到的合约源文件
123456789101112131415161718192021222324252627282930313233343536373839/** *Submitted for verification at polygonscan.com on 2022-06-23*/// SPDX-License-Identifier: MITpragma solidity ^0.8.0;interface BC_Interface & ...
无题
BanaCat NFT Contract(3/3)
关于BanaCatNFT
BanaCat一期项目是一个部署在polygon区块链上的头像数字艺术品
项目链接:BanaCato_O - Collection | OpenSea
合约源码地址:https://polygonscan.com/address/0xd2bc5c3990c06ccd26f10a3e9d93b19450136c8d#code
同时,基于这款数字艺术品也设计了配套的表情包周边,目前已经有一款已经上架到微信表情包商城,表情包链接:香蕉猫看戏篇
本文主要讲解BanaCatNFT内置的特殊的mint通道。发布BanaCatNFT之前因为没有进行前期的宣传以及收集白名单,但为了让项目尽快上线同时减少用户的获取门槛,不同于传统的白名列表或者默克尔树方式,一期的BanaCatNFT采用了输入密码进行mint的方式,接下来我们一起分析这种特殊的freeMint方案的利弊。
整体思路:设置长度为5的密码数组,分别记录5个不同的密码用以对应不用的mint场景,每个密码都可以设置对应可以mint的NFT数量,用户得知密码之后,在特 ...
无题
BanaCat NFT Contract(1/3)
关于BanaCatNFT
BanaCat一期项目是一个部署在polygon区块链上的头像数字艺术品
项目链接:https://opensea.io/collection/banacat-v2
合约源码地址:https://polygonscan.com/address/0xd2bc5c3990c06ccd26f10a3e9d93b19450136c8d#code
同时,基于这款数字艺术品也设计了配套的表情包周边,目前已经有一款已经上架到微信表情包商城,表情包链接:香蕉猫看戏篇
合约中所有的“读”函数。(函数只能读取合约的状态,但不会改变合约状态)
balanceOf():返回地址参数在本合约中所持有NFT的数量。
建立一个address 到token数量的映射表,函数balanceOf()检查地址的合法性的前提下,返回映射表中返回地址持有的NFT数量。
baseExtension():Metadata文件的格式说明,这里是json格式,所以返回“.json”。
baseExtension也可以在后期通过函数进行修改
...
无题
BanaCat NFT Contract(2/3)
关于BanaCatNFT
BanaCat一期项目是一个部署在polygon区块链上的头像数字艺术品
项目链接:BanaCato_O - Collection | OpenSea
合约源码地址:https://polygonscan.com/address/0xd2bc5c3990c06ccd26f10a3e9d93b19450136c8d#code
同时,基于这款数字艺术品也设计了配套的表情包周边,目前已经有一款已经上架到微信表情包商城,表情包链接:香蕉猫看戏篇
“写”函数会改变合约的状态,每一笔交易都会消耗一定的gas。
因为要用自己的私钥为每一笔交易签名,所以在与合约交互之前,要先链接上自己的钱包。
approve():将单个NFT的授权给某个operator,让其可以代理NFT的拥有者进行转出操作,后面会有实例说明。
_tokenApprovals 是一个tokenID到 operator地址的映射表,approve()函数正是以此为依据将NFT授权给某个地址。
mint(): NFT铸造函数,NFT项目在宣发 ...
无题
OnChain Transaction Debugging: 7. Nomad Bridge 跨鏈橋事件分析 (2022/08)
作者:gmhacker.eth
翻譯: Spark
事件概览(Introduction)
2022年8月1日,Nomad Bridge 遭到黑客攻击。1.9亿美元的锁定资产在此次事件中被盗。在第一名黑客成功攻击之后,引来里许多来自黑暗森林的旅客的模仿攻击,最终导致了一个严重的,攻击源众多的安全事件。
根本原因是在Nomad的一个代理合约的例行升级中,将零哈希值标记为可信根,这使得任意消息都可以自动得到证明。黑客利用这个漏洞来欺骗桥合约,并解锁资金。第一个攻击交易 从桥合约获利100 WBTC,约合230万美元。
此次攻击中,攻击者无需进行闪电贷款或与其他DeFi协议进行其他复杂的交互。攻击的过程仅仅调用了合约上的一个函数,并以正确的消息输入进而向协议的流动性发动攻击。攻击交易的简单和可重放性导致其他人也收集了部分非法利润让整个事件变得更糟。
正如Rekt News提到的,“诚如DeFi的游戏规则,这次黑客攻击几乎是无门槛的,任何人都可以加入进来。”
背景知识 ...
无题
Solidity如何在数组中删除指定元素
Solidity中的数组相对于其他语言来说,功能很少,仅有push/pop两种功能。但是我们在实际开发中,可能会遇到删除指定元素的场景,那么这个功能改如何实现呢?
简单的方案(?)
在solidity中存在一个关键词叫做delete那么直接使用这个关键词,删除指定元素是否能解决问题呢?
12345678910pragma solidity ^0.8.9;contract itemRemoval{ uint[] public arrs = [1,2,3,4,5]; function removeItem(uint i) public { delete arrs[i]; } function getLength() public view returns(uint){ return arrs.length; }}
对于以上这段代码,我们尝试删除第一个元素,执行removeItem(0),arrs将会变成这样:[0,2,3,4,5],
接下来运行getLength(), ...
无题
OnChain Transaction Debugging: 7. Hack Analysis: Nomad Bridge (2022/08)
Author: gmhacker.eth
Introduction
The Nomad bridge was hacked on August 1st, 2022, and $190m of locked funds were drained. After one attacker first managed to exploit the vulnerability and struck gold, other dark forest travelers jumped to replay the exploit in what eventually became a colossal, “crowdsourced” hack.
A routine upgrade on the implementation of one of Nomad’s proxy contracts marked a zero hash value as a truste ...