无题
WTF Solidity专题
工具
第1讲:Remix, 最易用的Solidity IDE 【代码】 【文章】
第2讲:Infura, 连接链下与链上的桥梁 【文章】
第3讲:Ganache,搭建本地测试网络 【文章】
第4讲:Alchemy, 区块链API和节点基础设施 【文章】
第5讲:Dune,使用Dune可视化区块链数据 【文章】
第6讲:Hardhat,以太坊开发环境 【文章】
第7讲:Foundry,以Solidity为中心的开发工具包 【代码】
第8讲:ZAN,节点服务和合约审计等Web3技术服务 【文章】
链上威胁分析
第1讲:工具篇 【文章】 | 【English】
第2讲:热身篇 【文章】 | 【English】
第3讲:漏洞概念验证-上篇 【文章】| 【English】
第4讲:漏洞概念验证-中篇 【文章】| 【English】
第5讲:漏洞概念验证-下篇 【文章】| 【English】
第6讲:Rugpull 分析 【文章】| 【English】
第7讲:Nomad 跨链桥事件分析 【文章】| 【English】
NFT
第1讲:ERC721库:Address, ...
无题
深入以太坊虚拟机系列
原文:
Diving Into The Ethereum Virtual Machine
Diving Into The Ethereum VM Part 2 — How I Learned To Start Worrying And Count The Storage Cost
Diving Into The Ethereum VM Part 3 — The Hidden Costs of Arrays
Diving Into The Ethereum VM Part 4 — How To Decipher A Smart Contract Method Call
Diving Into The Ethereum VM Part 5 — The Smart Contract Creation Process
Diving Into The Ethereum VM Part 6 — How Solidity Events Are Implemented
原文作者:Howard
翻译:alphafitz
写在前面:这是作者 Howard 在 2017 年开始写 ...
无题
Metamask项目方给Solidity程序员的16个安全建议
原文:Solidity Best Practices for Smart Contract Security
原文作者:Consensys(metamask项目方)
翻译:0xAA
Github: WTFSolidity
写在前面:
这是Metamask项目方(Consensys)在2020年8月写的一篇博客,关于智能合约安全,其中给了Solidity程序员16条安全建议,并包含代码样例。
这篇文章写于一年半前,那时候solidity版本才到0.5,现在已经是0.8了,很多函数都不同。但很多建议至今仍然适用,读完对我帮助很大。我在网上没找到中文翻译,就简单翻译了一下,并标明了版本差异可能导致的问题,供中文开发者学习。
这篇文章的安全理念也融入到WTF Solidity极简入门教程中。
By 0xAA
如果您已经牢记智能合约的安全理念并且正在处理EVM的特性,那么是时候考虑一些特定于Solidity编程语言的安全模式了。在本综述中,我们将重点关注Solidity的安全开发建议,这些建议也可能对用其他语言开发智能合约具 ...
无题
深入以太坊虚拟机 Part1 — 汇编与字节码
原文:Diving Into The Ethereum Virtual Machine | by Howard | Aug 6, 2017
Solidity 提供了许多高级语言抽象,但是这些特性使得人们很难理解程序运行时到底发生了什么。阅读 Solidity 文档仍然使我对非常基本的事情感到困惑。
string,bytes32,byte[],bytes 有什么区别?
我该使用哪一个?何时使用?
当我把 string 转换为 bytes 时会发生什么?能转换为 byte[] 吗?
它们费用是多少?
EVM 中如何存储映射(mapping)?
为什么不能删除一个映射?
可以使用映射的映射吗?(可以,但它是如何工作的?)
为什么有存储映射(storage mapping)但没有内存映射(memory mapping)?
编译后的合约对 EVM 来说是怎样的?
合约是如何创建的?
什么是 constructor?真的吗?
什么是 fallback 函数?
我认为学习像 Solidity 这样的高级语言如何在以太坊 VM(EVM) ...
无题
深入以太坊虚拟机 Part2 — 固定长度数据类型的表示
原文:Diving Into The Ethereum VM Part 2 — How I Learned To Start Worrying And Count The Storage Cost | by Howard | Aug 14, 2017
在本系列的第一篇文章中,我们了解了一个简单的 Solidity 合约的汇编代码:
1234567contract C { uint256 a; function C() { a = 1; }}
该合约归结为调用 sstore 指令:
12// a = 1sstore(0x0, 0x1)
EVM 将值 0x1 存储在存储(storage)位置 0x0
每个存储位置可以存储 32 个字节(或 256 位)
如果看起来不熟悉,建议阅读:深入以太坊虚拟机 Part1 — 汇编与字节码。
在本文中,我们将开始研究 Solidity 如何使用 32 字节的块(chunks)来表示更复杂的数据类型,比如结构体和数组。我们还将了解如何优化 ...
无题
深入以太坊虚拟机 Part3 — 动态数据类型的表示
原文:Diving Into The Ethereum VM Part 3 — The Hidden Costs of Arrays | by Howard | Aug 24, 2017
Solidity 提供了其他编程语言中常见的数据结构。除了像数字和结构体这样的简单值之外,还有一些数据类型可以随着更多数据的添加而动态扩展。这些动态类型的三个主要类别是:
映射:mapping(bytes32 => uint256),mapping(address => string),等等
数组:[]uint256,[]byte,等等
字节数组,只有两种:string,bytes。
在本系列的上一部分中,我们看到了具有固定大小的简单类型如何在存储中表示。
基本值:uint256,byte,等等
固定大小的数组:[10]uint8,[32]byte,bytes32
结合上面类型的结构体
具有固定大小的存储变量在存储中一个接一个地放置,尽可能紧密地打包成 32 字节的块。
(如果这部分看起来不熟悉,请阅读 深入以太坊虚拟机 ...
无题
深入以太坊虚拟机 Part4 — 智能合约外部方法调用
原文:How To Decipher A Smart Contract Method Call | by Howard | Sep 18, 2017
在本系列的前几篇文章中,我们已经了解了 Solidity 如何表示 EVM 存储中的复杂数据结构。但是,如果无法与之交互,数据将毫无用处。智能合约是数据与外界之间的中介。
在本文中,我们将了解 Solidity 和 EVM 如何使外部程序能够调用合约的方法并导致其状态发生变化。
“外部程序”不限于 DApp/JavaScript。任何可以使用 HTTP RPC 与以太坊节点通信的程序都可以通过创建交易与部署在区块链上的任何合约进行交互。
创建一个交易就像发出一个 HTTP 请求。Web 服务器将接受您的 HTTP 请求并对数据库进行更改。交易会被网络接受,并且底层区块链扩展到包括状态变化。
交易之于智能合约就像 HTTP 请求之于 Web 服务一样。
如果对 EVM 汇编和 Solidity 数据表示不熟悉,请参阅本系列之前的文章以了解更多信息:
深入以太坊虚拟机 Part1 ...
无题
深入以太坊虚拟机 Part5 — 智能合约创建过程
原文:Diving Into The Ethereum VM Part 5 — The Smart Contract Creation Process | by Howard | Oct 24, 2017
在本系列的前几篇文章中,我们学习了 EVM 汇编的基础知识,以及 ABI 编码如何允许外部世界与合约进行通信。在本文中,我们将了解如何从无到有创建合约。
本系列的前几篇文章(按顺序)。
深入以太坊虚拟机 Part1 — 汇编与字节码
深入以太坊虚拟机 Part2 — 固定长度数据类型的表示
深入以太坊虚拟机 Part3 — 动态数据类型的表示
深入以太坊虚拟机 Part4 — 智能合约外部方法调用
到目前为止,我们看到的 EVM 字节码很简单,只是 EVM 从上到下执行的指令,没有魔法。合约创建过程更有趣,因为它模糊了代码和数据之间的界限。
在学习如何创建合约时,我们会看到有时数据就是代码,有时代码就是数据。
戴上你最喜欢的巫师帽🎩
A Contract’s Birth Certificate
让我们创建一个简单(而且完 ...
无题
{"name":"hello_wtf","version":"1.0.0","lockfileVersion":2,"requires":true,"packages":{"":{"name":"hello_wtf","version":"1.0.0","license":"ISC","dependencies":{"@openzeppelin/contracts":"^4.7.3"}},"node_modules/@openzeppelin/contracts":{"version":"4.7.3","resolved":"https://registry.npmmirror.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz","integrity":"sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw=="}},"dependencies":{"@openzeppelin/contracts":{" ...
无题
{"name":"hello_wtf","version":"1.0.0","description":"","main":"index.js","directories":{"lib":"lib","test":"test"},"scripts":{"test":"echo \\\"Error: no test specified\\\" && exit 1"},"keywords":[],"author":"","license":"ISC","dependencies":{"@openzeppelin/contracts":"^4.7.3"}}