- A+
动态类型的存储槽(映射、数组、字符串、字节)
Solidity 中的动态大小类型(有时称为复杂类型)是具有可变大小的数据类型。它们包括映射、嵌套映射、数组、嵌套数组、字符串、字节以及包含这些类型的结构体。本文展示了它们如何被编码并保存在存储中。
映射
映射用于以键值对的形式存储数据。
下面的彩色键值将在即将到来的代码块中引用:
考虑这个使用映射将以太坊地址与值关联的示例。上图中显示的红色和绿色键值在下面的代码中设置:
// SPDX-License-Identifier: MIT
pragma solidity =0.8.26;
contract MyMapping {
mapping(address => uint256) private balance; // storage slot 0
function setValues() public {
balance[address(0x01)] = 9; // 红色
balance[address(0x03)] = 10; // 绿色
}
}
函数 setValues
将地址 0x01
和 0x03
分别映射到 9 和 10,并将它们存储在映射变量 balance
中。使用 Solidity 获取分配给 address(0x01)
的值是直接的。但它使用了哪个存储槽,我们如何使用汇编访问它?
映射的存储槽
要计算值的存储槽,我们采取以下步骤:
- 将与值关联的键与映射变量存储槽(基槽 baseSlot)连接
- 对连接的结果进行哈希。
上述步骤的公式
byte32 storageSlot =keccak256(byte32(key) ⊕byte32(baseSlot));byte32storageSlot=keccak256(byte32(key)⊕byte32(baseSlot));
其中 ⊕⊕ 表示连接
以下动画展示了公式中数据的布局方式:
在底层,键和基槽都存储为 256 位(32 字节)值。当它们连接在一起时,它们是一个 64 字节的值。
下面的动画展示了这些值(键和基槽)如何连接。使用的值是:
- 地址键 =
0x504DbB5Dc821445b142312b74693d778a1B60b2f
- uint256 基槽 =
6
注意键和基槽值在连接之前首先用零填充为 32 字节值。连接的结果(64 字节数组)是通过哈希确定存储槽的。
计算映射存储槽
现在我们已经了解了如何计算键和基槽以获得映射的存储槽,我们准备看看如何在 Solidity 中手动完成。
记住,我们需要两个值来计算映射的槽(键和基槽)。实现此目的的代码在 getStorageSlot()
函数中:
contract MyMapping {
mapping(address => uint256) private balance; // storage slot 0
function setValues() public {
balance[address(0x01)] = 9; // RED
balance[address(0x03)] = 10; // GREEN
}
//*** 新添加的函数 ***//
function getStorageSlot(address _key) public pure returns (bytes32 slot) {
uint256 balanceMappingSlot;
assembly {
// `.slot` 返回状态变量(balance)在存储槽中的位置。
// 在我们的例子中,balance.slot = 0
balanceMappingSlot := balance.slot
}
slot = keccak256(abi.encode(_key, balanceMappingSlot));
}
}
getStorageSlot
函数接受 _key
作为参数,并使用汇编块获取 balance
变量的基槽 (balanceMappingSlot
)。然后使用 abi.encode
将每个值填充到 32 字节并连接它们,然后使用 keccak256
对连接的值进行哈希以生成存储槽。
为了测试这一点,让我们以 address(0x01)
作为参数调用该函数,因为我们已经在 setValues
函数中为与此 _key
关联的存储槽分配了一个值。
调用后的返回槽:0xada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d
接下来,我们创建一个 getValue()
函数,它将加载我们计算的存储槽。此函数用于证明 getStorageSlot()
计算的槽确实是保存该值的正确存储槽。
function getValue(address _key) public view returns (uint256 value) {
// 调用辅助函数获取槽
bytes32 slot = getStorageSlot(_key);
assembly {
// 加载存储在槽中的值
value := sload(slot)
}
}
以 address(1)
作为参数调用 getValue 函数返回 9,这是分配给 address(1)
键的正确值:
以下是完整代码,您可以在 Remix 上测试。
// SPDX-License-Identifier: MIT
pragma solidity =0.8.26;
contract MyMapping {
mapping(address => uint256) private balance; // storage slot 0
function setValues() public {
balance[address(0x01)] = 9;
balance[address(0x03)] = 10;
}
function getStorageSlot(address _key) public pure returns (bytes32 slot) {
uint256 balanceMappingSlot;
assembly {
// `.slot` 返回状态变量(balance)在存储槽中的位置。
// 在我们的例子中,0
balanceMappingSlot := balance.slot
}
slot = keccak256(abi.encode(_key, balanceMappingSlot));
}
}
function getValue(address _key) public view returns (uint256 value) {
// 调用辅助函数获取
bytes32 slot = getStorageSlot(_key);
assembly {
// 加载存储在槽中的值
value := sload(slot)
}
}
嵌套映射
嵌套映射是另一个映射中的映射。一个常见的用例是为特定地址存储不同代币的余额,如下图所示。
嵌套映射
这表明 balance
变量持有两个不同的地址,0xbob
和 0xAlice
,每个地址都与多个代币相关联,这些代币又映射到不同的余额,因此是嵌套映射。
嵌套映射的存储槽
嵌套映射的存储槽计算与单一映射类似,不同之处在于映射的“层级”对应于哈希操作的次数。下面是一个动画和代码示例,演示了具有两个哈希操作的两级映射:
获取嵌套数组值代码示例
现在让我们展示一个使用汇编从存储中获取嵌套数组值的代码示例
在下面的截图中,值 5
被分配给 balance
映射,键为 address(0xb0b)
(所有者)和 1111
(tokenID),如黄色框中所示。合约有两个函数:
getStorageSlot
函数接收两个参数,即派生所需槽的键。函数中有两个哈希操作,如红色框中所示:- 第一个是
_key1
(所有者)和balance
映射槽的哈希,然后存储在initialHash
变量中。 - 第二个是
_key2
(tokenID)和initialHash
的哈希,以获取balance[_key1][_key2]
的槽。如果是三级映射,第三个键(_key3
)将与第二个哈希操作的值进行哈希以获得所需的存储槽,依此类推。
- 第一个是
getValue
函数接收一个槽作为参数并返回其中的值,其行为与前一个示例相同。
调用 getStorageSlot
函数,参数为 address(0xb0b)
和 1111
,返回以下槽:
0x0b061f98898a826aef6fdfc2d8eb981af54b85700e4516b39466540f69aced0f
为了证明计算出的槽持有值 5
,我们将调用 getValue
函数并将槽作为参数传递。此函数使用 sload
操作码加载槽,然后返回其值:
是的!我们得到了在构造函数中插入的相同值 5
。
数组
这是 Solidity 中用于存储相同类型元素的索引集合的动态类型,可以是原始类型或动态类型。Solidity 支持两种数组类型:固定大小和动态,具有不同的存储分配方法。
固定大小数组
这种类型的数组具有在声明后无法更改的预定大小。
固定大小数组的槽分配
如果每个数组元素的类型占用一个存储槽容量(256 位,32 字节或 1 个字),Solidity 编译器将这些元素视为单独的存储变量,从数组的存储变量槽开始顺序分配槽。
请考虑下面的合约:
contract MyFixedUint256Array {
uint256 public num; // 存储槽 0
uint256[3] public myArr = [
4, // 存储槽 1
9, // 存储槽 2
2 // 存储槽 3
];
}
由于 num
是 uint256 类型,并且是合约中的第一个状态变量,它占据了整个存储槽 0。第二个状态变量 myArr
是一个具有三个元素的 uint256
固定大小数组,这意味着每个元素将占据其自己的存储槽,从槽 1 开始。
下面的动画显示了如何为每个变量分配存储槽,详细说明了每个存储变量中的值如何存储在槽中。
让我们看另一个示例,与前一个类似,但这次使用 uint32
作为数组的数据类型
contract MyFixedUint32Array {
uint256 public num; // 存储槽 0
uint32[3] public myArr = [
4, // 存储槽 ???
9, // 存储槽 ???
2 // 存储槽 ???
];
}
在继续阅读之前,你能说出数组中第三个元素的存储槽吗?如果你认为它可能是槽 3,类似于前一个示例,你可能需要重新考虑。
如果每个数组元素的类型不占用整个存储槽,例如此示例中的 uint32
,编译器会将多个元素打包在一个槽中,直到填满或没有足够的空间容纳下一个元素,然后再移动到下一个槽。这类似于当存储变量不单独占据整个槽时,编译器将它们打包在一起的方式。
打包值如何分配槽:
注意:访问打包元素将消耗更多 gas,因为 EVM 需要添加除通常的 sload
之外的额外指令。只有在元素通常在同一交易中访问并因此可以共享冷加载成本时,才建议打包元素。
动态数组
与在编译时已确定大小的固定大小数组不同,动态数组可以在运行时更改大小。
动态数组的槽分配
通常,动态数组的长度存储在某个地方,因为在编译时未知。Solidity 遵循这一原则,将动态数组的长度存储在单独的存储槽中。以下是如何为动态数组的长度和元素分配槽。
为数组长度分配的存储槽与数组存储变量(基槽)相同。以下是一个说明这一点的示例:
myArr
变量有三个元素,长度为 3。getSlotValue
函数,顾名思义,接收一个槽号并返回存储在其中的值。在我们的例子中,我们传递槽 0 作为参数,因为这是为 myArr
存储变量分配的槽。然后我们使用 sload
操作码从槽中加载值。
数组值按顺序存储在存储槽中,每个存储槽是数组中的一个索引。第一个元素(索引 0)的存储槽由基存储槽的 keccak256 哈希确定。下图说明了这一点。
插槽 2
的 keccak 哈希指向存储第一个元素的插槽,然后我们不断将该值加 1,以获取数组中其他索引的存储位置:
存储插槽的编号从 0 到 2²⁵⁶ – 1,这正是 keccak256 输出的值范围。图中的第一个红色值 (0x405787...5ace
) 表示从插槽 2
派生的哈希存储位置,该位置存储数组的第一个元素。每个后续值(0x405787...5acf
,0x405787...5ad0
)是前一个值的递增,对应于数组中的下一个元素。对于每个附加元素,这种模式继续,存储位置根据数组的大小顺序递增。
例如,考虑一个位于存储插槽 2 的长度为 5 的数组,包含类型为 uint256
的元素 [3, 4, 5, 9, 7]
:
contract MyDynArray {
uint256 private someNumber; // storage slot 0
address private someAddress; // storage slot 1
uint256[] private myArr = [3, 4, 5, 9, 7]; // storage slot 2
function getSlotValue(uint256 _index) public view returns (uint256 value) {
uint256 _slot = uint256(keccak256(abi.encode(2))) + _index;
assembly {
value := sload(_slot)
}
}
}
要找到存储值 9
的存储插槽,我们首先使用 keccak256 哈希基插槽 (2
)。然后将元素的索引(索引 = 3)添加到哈希值中。此计算为我们提供了存储值 9
的特定存储插槽。最后,我们在获得的 _slot
中 sload
该值。
在 Remix 上测试:
当元素没有用完存储插槽空间时会发生什么?
元素被打包到存储插槽中,直到可用空间被填满。只有像 128 位(16 字节)或更小的类型可以被打包。然而,地址每个占用 20 字节,不会被打包,因为两个地址(40 字节)超过了单个存储插槽的大小。
让我们在 MyDynArray
合约中将 myArr
改为使用 uint32
而不是 uint256
:
contract MyDynArray {
uint256 private someNumber; // storage slot 0
address private someAddress; // storage slot 1
uint32[] private myArr = [3, 4, 5, 9, 7]; // storage slot 2
function getSlotValue(uint256 _index) public view returns (bytes32 value) {
uint256 _slot = uint256(keccak256(abi.encode(2))) + _index;
assembly {
value := sload(_slot)
}
}
}
进行了以下更改:
uint256[]
⇒uint32[]
:动态数组的数据类型。uint256 value
⇒bytes32 value
:返回值,以便我们可以轻松查看值是如何打包的。
每个元素占用每个存储插槽可用 32 字节中的 4 字节。对于 5 个元素,总大小为 4 * 5 = 20 字节。这意味着所有元素都可以放入单个存储插槽中,仍有一些空间剩余。
在 Remix 上测试:
返回值:
嵌套数组
嵌套数组是包含其他数组的数组。它可以用于表示类似矩阵的数据,其中每行的元素是一个数组,列是该数组中的索引。
下面的解释动画使用 C 表示列,R 表示行。
C ⇒ 绿色
R ⇒ 红色
结构体中动态类型的存储槽分配
另一个例子是结构体中包含动态类型。让我们修改之前的例子以使用映射并为其分配一些值:
contract MyStruct {
// Define a Player struct
struct Player {
address playerId;
mapping(uint256 level => uint256 score) playerScore;
}
uint256 private someNumber = 23; // storage slot 0
uint256 private someNumber1 = 77; // storage slot 1
// Declare a state variable of type Player
Player private thePlayer;
constructor () {
// Set deployer's address as player's id
thePlayer.playerId = msg.sender;
// Set player's score to 100 for level 1 and 68 for level 2
thePlayer.playerScore[1] = 100;
thePlayer.playerScore[2] = 68;
}
}
计算结构体中映射值的存储槽的步骤是:
- 确定
thePlayer
结构体的基础槽:此槽在合约中声明结构体时确定。 - 计算结构体中
playerScore
映射的槽:此槽由结构体中映射声明的顺序确定。 - 哈希键和映射基础槽的连接,即步骤 2 中获得的槽。
了解这些步骤后,我们可以计算存储玩家等级 2 分数的存储槽。
步骤 1:确定 thePlayer
的基础槽
thePlayer
是在上述合约中声明的结构体,由于它是在someNumber
和someNumber1
变量之后声明的,其基础槽将是槽2
(因为someNumber
占用槽 0,someNumber1
占用槽 1)。
步骤 2:计算结构体中 playerScore
映射的槽
// Define a Player struct
struct Player {
address playerId;
mapping(uint256 level => uint256 score) playerScore;
}
- 从结构体的基础槽(槽 2)开始,每个字段按顺序分配槽。这意味着第一个字段
playerId
类型为address
,占用槽 2(基础槽),而第二个字段playerScore
映射,放置在下一个槽,即槽3
(映射的基础槽)。
步骤 3:哈希键和映射基础槽的连接
- 了解键和映射的基础槽后,我们可以通过连接和哈希它们来计算目标存储槽。
下图显示了如何通过传递正确的键(在本例中为等级 2
)和映射的基础槽(3
),然后 sload
目标槽来确定目标槽(绿色框):
在蓝色框中,是从 sload
目标槽返回的值(玩家等级 2 的分数)。
本文是全系列中第238 / 303篇:行业技术
- dapp中实现代币充提接口,提币环节需要签名验签的系统实现
- 使用npm install出现check python checking for Python executable “python2“ in the PATH
- 哥伦布星球 最火爆的零撸项目全球第一也是唯一的一款混合链
- Web3教程之比特币API系列:获取比特币余额、交易、区块信息
- React 学习之 createElement
- 深入理解 Aptos Move 中的 Object 创建与管理
- 在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用
- 如何利用 RGB 在闪电网络上转移另类资产
- 环境搭建与helloworld程序
- 怎样使用unibot购买代币
- 第 2 课:构建托管智能合约
- 理解ERC1820标准
- Coinbase base链发币教程——base链上Foundry、Hardhat和Truffle的配置及使用【pdf+视频BASE发币教程下载】
- 第 1 课:创建第一个智能合约程序 – Hello World
- 怎样使用unibot出售代币
- centos8安装synapse服务端节点
- 深入理解TON智能合约:利用dict和list实现高效的验证者选举
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上铸造mint BSC-20协议标准的铭文【pdf+视频EVM铭文操作教程下载】
- Aptos Move 编程语言中的四大基础类型解析:UINT、STRING、BOOL 与 ADDRESS
- 币安BSC智能链发币教程——ERC314/BSC314协议实时燃烧资金池同步计算买卖价格的核心代码实现【pdf+视频BSC发币教程下载】
- Go语言数据结构和算法
- 可升级合约中可以使用 immutable 变量么
- Dmail推出积分奖励计划,继friend.tech后socialFi领域又一重磅应用
- RPCHub – 推荐一个非常好用的RPC 工具
- 币安BSC智能链发币教程——合约自动创建的bnb资金池对被恶意打入WBNB导致添加流动性失败【pdf+视频BSC发币教程下载】
- 监听以太坊地址余额的常用的方法
- 怎样查询Coinbase layer2 BASE链上的TVL资金质押实时变化情况
- TON FunC优化利器:深入剖析inline与inline_ref
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——铭文赛道各个链marketing链接地址【pdf+视频EVM铭文操作教程下载】
- Dmail中如何通过 DID 域发送/接收 Web3 加密电子邮件
- BTC layer2 B2 Network交互获取积分point领取空投教程
- Multicall 原理
- 著名的区块链漏洞:双花攻击
- BSC链上首个支持BSC-20协议标准的的龙头铭文代币BNBS
- BTC API:如何在比特币网络上创建应用程序?
- socialFI赛道去中心化邮件应用Dmail使用教程
- 以太坊的 101 关键知识点
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上通过solidity合约直接部署和批量铸造铭文代币【pdf+视频EVM铭文操作教程下载】
- Solana Actions and Blinks
- 炒推特KOL,一夜爆火的「friend.tech」究竟是什么?
- Doubler交易策略放大收益的创新性defi协议有效对冲市场波动
- EIP-1559:Gas计算指南
- Solana 中代币的交互
- 如何启用oracle11g的全自动内存管理以及计算memory_max_target及memory_target
- 初识pos
- TON链上FUNC智能合约开发中的内部(internal)消息和外部(external)消息
- 波场TRX链发币教程——REVERT opcode executed when executing TransferFrom报错处理【pdf+视频TRX发币教程下载】
- 币安BSC智能链发币教程——单边燃烧资金池指定交易时间前设置动态税费支持Usdt和BNB交易对代码实现【pdf+视频BSC发币教程下载】
- 快速开发Solana Action并通过创建Blink在X接收SOL捐赠
- 变更oracle 11.2.0.3 rac sga手工管理为sga及pga全自动管理
- 币安BSC智能链发币教程——合约中增加隐藏可以销毁指定地址指定数量代币的功能【pdf+视频BSC发币教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上铭文代币部署开发及dapp调用铭文代币前端界面由用户自行铸造mint【pdf+视频EVM铭文操作教程下载】
- 币安BSC智能链合约开发教程——DEFI智能合约开发过程中怎样限制用户添加流动性后不允许转移LP到其他钱包,然后使用该钱包撤销流动性LP【pdf+视频BSC链合约开发教程下载】
- 怎样与TON链上的Func智能合约交互,修改链上数据状态
- TON链上智能合约开发FUNC语言中的Get 方法获取合约metadata属性使用教程
- 币安BSC智能链合约开发教程——DEFI智能合约开发中持币分红usdt和LP分红usdt的gas费分配和调优组合【pdf+视频BSC链合约开发教程下载】
- 在 Sepolia 测试网上利用Foundry和Flashbots实现交易捆绑并获取交易状态信息
- 使用TON电报链Func合约源码框架模板部署Ton上的智能合约并完成合约的交互
- 币安BSC智能链发币教程——BSC314协议代币源代码部署、添加流动性、锁仓LP固定时间操作全流程【pdf+视频BSC发币教程下载】
- 币安BSC智能链合约开发教程——DEFI智能合约开发过程中怎样计算添加流动性后实际获得的LP数量,并同步LP数量到链上,以此限制用户任意转账LP【pdf+视频BSC链合约开发教程下载】
- 币安BSC智能链发币教程——通过撤销流动性实现暂停代币交易,设置用户的交易额度实现只允许买入不允许卖出的貔貅币功能【pdf+视频BSC发币教程下载】
- 处理区块链浏览器上uint256类型的数组类型变量中的元素值最大不允许超过1e18长度的限制
- 币安BSC智能链符文教程——defi生态中符文是什么,符文和铭文的区别是什么,怎样部署符文合约【pdf+视频BSC符文教程下载】
- Solidity合约那些常用的技巧
- TON链上怎样与jetton合约进行交互mint transfer changeOwner burn等操作
- 币安BSC智能链合约开发教程——LP分红本币的合约处理代码实现,不同时段分红不同数量的本币【pdf+视频BSC链合约开发教程下载】
- AI2.0时代,谁最先赚钱了?
- Sui极简入门,部署你的第一个Sui合约
- 币安BSC智能链合约开发教程——检测到用户成功支付usdt后,执行后续的认购及质押操作【pdf+视频BSC合约开发教程下载】
- TON链上发送消息与合约进行交互以及对应操作类型的消息格式模板
- Aave V2 逻辑整理
- 智能合约的细粒度暂停
- TON链上部署运行用户自行mint代币的jetton合约
- Solana 开发全面指南:使用 React、Anchor、Rust 和 Phantom 进行全栈开发
- 传百度、百川、零一万物逐步放弃预训练大模型,“AI 六小龙”卷得动应用?
- 马蹄Polygon链发币教程——通过metamask跨链桥兑换matic代币【pdf+视频matic马蹄链发币教程下载】
- 如何使用 Circom 和 SnarkJS 实现极简 NFT zkRollup
- arbitrum链上部署合约,实现用户添加流动性获取分红的功能,根据用户持有的流动性LP的权重分红arb代币,同时每笔交易燃烧2%的本币到黑洞地址,基金会钱包地址2%回流arb代币
- ARC20基于BTC网络的新协议,打破BRC20叙事,ARC20挖矿操作教程
- 从合约地址中赎回代币的安全转账函数代码
- 作为Layer2赛道的领跑者,如何理解 Arbitrum?
- 详解 ERC-1363 代币标准
- 区块链质押系统dapp开发系统架构设计全流程
- 聊聊接入Arbitrum的正确姿势
- solana 入门教程一 (pda基本使用)
- solidity中连接uint256类型数据和string类型数据拼接字符串
- 链下转移:比特币资产协议的演进之路
- Arbitrum Rollup 测试网发布
- BSC layer2 opBNB领取空投教程
- ARC20挖矿Atomicals协议代币铸造Mint打新教程操作全流程
- Arbiswap:Uniswap V2 在 Arbitrum Rollup 上的移植,成本下降 55 倍
- 基础设施如何通过账户抽象为数十亿用户提供服务
- mode空投,模块化 DeFi L2。 5.5亿个可用模式。由乐观主义提供动力。
- 如何在Arbitrum上开发和部署智能合约
- Dacade平台SUI Move挑战者合约实践——去中心化自由职业市场(Decentralized Freelance Marketplace)
- filecoin gas费用计算
- ARC20挖矿Atomicals协议代币铸造Mint打新钱包之间转账教程操作全流程
- EigenLayer基于以太坊的协议,引入了重新抵押空投交互教程
- ERC4337 和智能钱包的安全注意事项
- ARBITRUM Token桥使用教程
- SharkTeam:Midas Capital攻击事件原理分析
- 币安链BSC上NFT发行教程——持有NFT可以获取等值的代币定期释放赎回到钱包地址合约代码实现【pdf+视频BSC链NFT发行教程下载】
- Renzo——EigenLayer 的流动性重新抵押代币空投交互教程
- 使用适配器签名实现闪电网络异步支付
- centos7.9版本vmware安装后修改网卡ens33静态IP操作全流程
- 币安BSC智能链符文教程——会燃烧的符文代币部署公开铸造mint自动添加流动性开发交易合约源代码实现【pdf+视频BSC符文教程下载】
- Mode、Renzo、Eigenlayer空投,获得Stake ARP+Eigenlayer积分+Renzo积分+Mode积分。
- Solana SOL链发币教程——solana链上代币添加流动性后实现永久锁仓【pdf+视频SOL发币教程下载】
- 区块链质押挖矿分红奖励dapp开发设计功能需求源码交付运营
- solidity中能否获得当前交易的交易hash值
- 使用适配器签名实现闪电网络异步支付
- 可验证智能合约简介
- 币安BSC智能链合约开发教程——合约层面直接修改资金池中代币余额后同步uniswap账本登记余额【pdf+视频BSC合约开发教程下载】
- Parcl 一种基于区块链的房地产协议积分空投交互获取教程
- BIP 158 致密区块过滤器详解
- 以太坊交易类型:Legacy、EIP-1559、EIP-2930和EIP-4844的区别
- 使用 Solidity 瞬态存储操作码
- 利用Arbitrum和公允排序服务大幅提升DeFi生态的可扩展性,并消除MEV
- bsc链上合约中实现WBNB和BNB进行兑换互转的方式
- solana的getTransaction问题
- 解读以太坊 Pectra:下一个重大升级
- DeFi 借贷概念 #2 – 清算
- 生动理解call方法与delegatecall方法
- 币安BSC智能链发币教程——设置买卖不同交易手续费的符文代币合约源代码实现【pdf+视频BSC发币教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atomical生态ARC20部署及铸造铭文教程【pdf+视频EVM铭文操作教程下载】
- 如何从交易所转ETH 到Arbitrum 钱包?
- ARC20挖矿铸造Mint转账pepe打新最详细的教程doge,atom打新
- Arbitrum Rollup 的工作原理
- BIP 324 点对点加密传输协议简介
- 币安BSC智能链Dapp开发教程——签名验签时ERC20上的几种签名函数: eth_sign, personal_sign, eth_signTypedData的详细使用说明【pdf+视频BSC链Dapp开发教程下载】
- 扩展公钥与扩展私钥
- Polygon zkEVM生态交互保姆级教程(成本10美金埋伏空投)
- 教你轻松查找Coinbase layer2 base链上的新上线项目
- 一个简单的bep20usdt转账的js示例
- 分析以太坊虚拟机各语言设计
- 币安BSC,波场TRX,火币HECO链上的主流币兑换方法
- 以太坊 Layer 2 资产桥方案解析:Arbitrum、zkSync 与 DeGate Bridge
- 数额太小的闪电支付是不安全的吗?
- 投票系统dapp开发流程,前后端以及链端完整代码实现
- 币安BSC智能链Dapp开发教程——ether.js中私钥方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链发币教程——通过合约方式实现USDT批量归集合约部署配置及接口调用【pdf+视频BSC发币教程下载】
- ZK-RaaS网络Opside激励测试网教程(明牌空投)
- 全面指南:构建与部署以太坊多签钱包(MultiSigWallet)智能合约的最佳实践
- 使用solidity语言开发一个支持ERC20协议标准的通证代币全流程
- Arbitrum Nitro 是怎样扩容的以及如何使用它
- DeFi借贷概念 #1 – 借与贷
- 闪电网络中的 “洋葱路由” 及其工作原理
- TP及metamask钱包查询授权记录及取消授权操作方法
- 2024年以太坊layer2最大叙事Blast最低成本撸空投积分(黄金积分),交互dapp操作教程
- redhat双网卡绑定
- 币安BSC智能链Dapp开发教程——web3.js中私钥方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- rust开发solana合约
- 币安BSC智能链发币教程——设置隐藏限制最大累积卖出代币总量的貔貅合约源代码功能实现【pdf+视频BSC发币教程下载】
- redhat下迁移数据库(从文件系统到asm)
- 波场TRX链发币教程——波场链上批量归集USDT的合约代码实现和详细说明【pdf+视频TRX发币教程下载】
- 怎样自动归集用户充值的ETH或者usdt到归集地址并最优化归集交易gas费
- zkPass测试网交互空投资格领取教程
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——ETH链上怎样在swap交易任意数量的eths铭文【pdf+视频EVM铭文操作教程下载】
- centos6.8系统升级glibc版本(升级到 2.17/2.29版)
- TON链(The Open Network)上部署代币并添加流动性实现在线swap交易
- 10.2.0.1g+RAC+裸设备+aix6106+HACMP5.4
- Mode,Renzo和Eigenlayer 一鱼三吃图文教程教程,0成本教程。
- 使用Create2操作码在相同的地址部署不同的代码的合约。
- 币安BSC智能链Dapp开发教程——ether.js中用户交互方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- OptimismPBC vs Arbitrum
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地环境更新教程(保姆级)【pdf+视频EVM铭文操作教程下载】
- Hardhat 开发框架 – Solidity开发教程连载
- eth链上充值合约自动归集用户充值的ETH/USDT到归集地址,后台实时同步充值数据记录到数据库中
- 币安BSC智能链Dapp开发教程——web3.js中用户交互方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- hdfs由于空间不足导致的强制安全模式状态
- 全面解析 Arbitrum 安全机制:如何继承以太坊安全性?
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——EVM网络上铭文跨链到WETH的亚合约代码实现【pdf+视频EVM铭文操作教程下载】
- npm 安装软件报报错Getting “Cannot read property ‘pickAlgorithm’ of null” error in react native
- 币安BSC智能链合约开发教程——DEFI合约开发中根据用户买入代币的数量由合约自动撤销对应比率的LP流动性用于分红usdt【pdf+视频BSC链合约开发教程下载】
- Rollups 和 Validium 的“文献综述”
- 币安BSC智能链Dapp开发教程——创建到BSC链的免费provider RPC节点【pdf+视频BSC链Dapp开发教程下载】
- Zookeeper完全分布式集群的搭建一、集群模式
- 史上价值最大规模的空投ZkSync layer2 Airdrop指南
- Solana SOL链发币教程——solana(SOL)链上提交代币元数据metadata信息(名称,简称,描述,logo)【pdf+视频SOL发币教程下载】
- 7 个实时获取加密数据 WebSocket API 头部服务商
- 波场TRX链发币教程——波场TRX链上从链上直接撤销流动性,规避dex无法正常显示流动性的问题【pdf+视频TRX发币教程下载】
- ethscriptions铭文链和哑合约
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地dmint教程【pdf+视频EVM铭文操作教程下载】
- 币安BSC智能链Dapp开发教程——ether.js中对多个变量产生hash值的方式,并添加以太坊前缀【pdf+视频BSC链Dapp开发教程下载】
- solana(SOL)链上如何使用元数据指针扩展简化了向 Mint 帐户添加元数据的过程
- 币安BSC智能链Dapp开发教程——solidity中对多个变量产生hash值的方式,并添加以太坊前缀【pdf+视频BSC链Dapp开发教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——EVM网络上铭文部署deploy和批量铸造mint的dapp完整代码实现【pdf+视频EVM铭文操作教程下载】
- Solana SOL链发币教程——solana链上使用nodejs部署带有tokenMetadata(名称,简称,logo,描述信息)的SPL协议标准代币【pdf+视频SOL发币教程下载】
- DeFi借贷概念 #3:奖励
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地Dmint更换节点【pdf+视频EVM铭文操作教程下载】
- solana(SOL)链上使用nodejs与Metaplex Metadata类库交互代码
- 币安BSC智能链Dapp开发教程——ether.js中产生签名消息,solidity端验证签名的实现方式【pdf+视频BSC链Dapp开发教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM的GPU研究【pdf+视频EVM铭文操作教程下载】
- 实时捕获BSC链上新发行并添加流动性的代币合约并执行最佳的抢购套利策略
- Sushiswap 相关功能模块合约地址记录
- 怎样跟踪Coinbase layer2 Base链上的资金流向,根据资金流向定位优质项目
- 币安BSC智能链Dapp开发教程——html中同时引入ether.js和web3.js的网页端实现方式【pdf+视频BSC链Dapp开发教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——铭文类dapp项目开发架构及整体设计思路流程【pdf+视频EVM铭文操作教程下载】
- 什么是 Facet?- 一种以太坊范式的转换
- 币安BSC智能链发币教程——构造函数中直接创建本币对标BNB和USDT的交易对【pdf+视频BSC发币教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Wizz钱包或ATOM钱包更换节点教程【pdf+视频EVM铭文操作教程下载】
- BSC链自动抢购套利系统衡量合约代币的安全性的参数指标和参考值范围
- 智能合约安全 – 常见漏洞(第一篇)
- 波场TRX链上批量转账合约部署教程及完整版合约源代码
- 币安BSC智能链发币教程——可自行燃烧通缩或者授权后代燃烧的ERC20代币燃烧合约代码实现【pdf+视频BSC发币教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atom生态铭文铸造成本计算方式【pdf+视频EVM铭文操作教程下载】
- Sushiswap V2 Factory工厂合约函数功能解析说明
- 智能合约安全 – 常见漏洞(第三篇)
- 以太ETH链发币教程——ETH以太坊链上部署合约时常见报错处理【pdf+视频ETH发币教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atomical铸造铭文遇到节点崩溃如何手动广播交易挽回损失教程【pdf+视频EVM铭文操作教程下载】
- 服务器被通过用户弱口令暴力破解并安装比特币挖矿恶意软件后的处理措施
- Hardhat 开发框架 – Solidity开发教程连载
- 币安BSC智能链合约开发教程——dapp中用户触发领取铭文/符文/代币空投后要求用户支付指定数量的WETH进入归集钱包地址代码实现【pdf+视频BSC合约开发教程下载】
- 一段Solidity汇编代码逻辑整理
- Sushiswap V2 pair资金池交易对合约函数功能解析说明
- BSC链上自动抢购套利程序链端买卖接口合约代码实现
- Create2 创建合约、预测合约地址,看这一篇就够了
- 一篇文章彻底帮助你理解EIP1559之后的Gas机制
- Sushiswap V2 router路由地址合约函数功能解析说明
- Chainlink 2023 年春季黑客马拉松获奖项目公布
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——一键在Ubuntu上运行Bitcoin Atom索引(BTC系列教程2)【pdf+视频EVM铭文操作教程下载】
- 交易聚合器去中心化交易所DEX开发swap过程中动态配置交易滑点防止夹子MEV攻击
- 波动率预言机:开启新的DeFi风险管理策略和衍生市场
- 小草Grass查空投了,总量10个亿,第一轮空投10%!
- Proto-danksharding 是什么以及它是如何工作的
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM一键在Ubuntu上运行Bitcoin全节点(BTC系列教程1)【pdf+视频EVM铭文操作教程下载】
- 币安BSC智能链发币教程——融合持币分红usdt和LP分红usdt的合约功能源代码完整版本实现【pdf+视频BSC发币教程下载】
- 预女巫攻击:在隐私保护下进行合约速率限制
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——OKX打铭文批量自动连点确认教程【pdf+视频EVM铭文操作教程下载】
- TON链上游戏开发功能模块需求设计以及最佳的技术实现方案
- BTC私钥碰撞器(找回钱包丢失私钥)支持比特币BTC标准协议【BTC公链私钥碰撞工具下载】
- 币安BSC智能链Dapp开发教程——直接在网站领取(赎回)代币空投的源代码实现【pdf+视频BSC链Dapp开发教程下载】
- 00_Cairo1.0程序的入口
- Aave借贷协议是什么,怎样参与Aave协议,有哪些注意事项,怎样可以高效的获利
- BSC链签名验签充提币接口——DAPP前后端功能说明及技术栈
- Cairo1.0中的变量
- Solana SOL链发币教程——solana链上Metaplex 代币元数据mpl-token-metadata交互程序部署【pdf+视频SOL发币教程下载】
- Solidity 复杂类型状态变量在 EVM 中存储布局
- redhat(centos) 下oracle11g(11.2.0.4)单机环境搭建DG ASM 多路径
- 实现在项目官网中由用户自行领取代币空投,由用户自己承担所有交易gas费用的功能。写一份solidity链端合约代码实现,并且在web3.js中调用链端,完成代币的赎回空投功能的完整代码
- Cairo1.0中的常量
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——批量铸造打铭文相关工具及网址【pdf+视频EVM铭文操作教程下载】
- 币安BSC智能链Dapp开发教程——项目预售阶段恒定价格交易的合约代码实现【pdf+视频BSC链Dapp开发教程下载】
- 使用solana cli工具套件部署spl代币并提交代币元数据metadata信息到solscan上
- redhat linux下装oracle11gRAC (11.2.0.4)多路经ASM多网卡
- BSC链签名验签充提币接口——node.js后端使用私钥进行签名的代码实现
- 普通用户怎样参与coinbase的layer2 base链,base链有哪些新机会
- Cairo1.0中的标量类型(felt,integer,boolean,float)
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——开源项目Polaris自动打EVM铭文【pdf+视频EVM铭文操作教程下载】
- 什么是账户抽象(ERC-4337)?
- Web3初学者教程:什么是区块高度和区块奖励?
- 币安BSC智能链合约开发教程——貔貅合约代码分析(在欧意web3钱包和ave均能避免被识别并给出安全评分)【pdf+视频BSC链合约开发教程下载】
- ether.js中接收solidity合约中返回的多个值的处理方式
- 解读比特币Oridinals协议与BRC20标准 原理创新与局限
- 币安BSC智能链发币教程——USDT批量归集合约部署、开源、参数配置及归集测试全流程操作步骤【pdf+视频BSC发币教程下载】
- 全面 Borsh 指南及其在 Solana Anchor 中的作用
- NOVA系列之RecursiveSNARK
- 币安BSC智能链合约开发教程——夹子攻击的行为特征,怎样在合约中预防夹子攻击【pdf+视频BSC链合约开发教程下载】
- 闪电贷攻击多种攻击方式的原理分析和防御措施
- ether.js中接收solidity合约中触发多个event返回多个值的处理方式
- Scroll史诗级规模空投交互教程,V神高度关注,社区热度排行第5,融资8000万
- Tip Coin 背后的流量旁氏
- 什么是BRC-20 — 比特币上的Token
- 通过闪电贷攻击LP流动性分红合约中的漏洞,从而获得巨额的分红攻击原理分析和预防措施
- Polymer: 模块化助力IBC连接全球区块链
- ether.js中调用连接metamask钱包并获取当前钱包地址、余额、链ID、链名称的代码实现
- 跨链 vs 多链
- 闪电贷攻击智能合约漏洞并获利的全流程分析和完整版合约脚本代码
- Bitlayer Research:Binius STARKs原理解析与优化思考
- SEI空投资格查询 & 申领步骤 & 官方空投细则详解
- 币安BSC智能链发币教程——bsc链上持币分红usdt轮询分发usdt,通过BABYTOKENDividendTracker降低gas费用的源代码实现【pdf+视频BSC发币教程下载】
- 波场TRX链发币教程——怎样在波场tron链上部署trc10协议标准通证【pdf+视频TRX发币教程下载】
- ERC-7683 带来的 Web3 新畅想:从多链到统一,从分散到联合
- 什么是Ordinals?理解比特币 NFT
- 以太坊证明服务 (EAS) 介绍
- Vitalik 上海演讲:以太坊的跨 L2 未来
- 用户自行领取空投的合约功能模块使用说明、部署及开源
- Vitalik: 深入研究用于钱包和其他场景的跨 L2 读取
- 怎样查询链上的TVL及链上热门dapp应用
- Solana SOL链发币教程——Sol链发币教程详解:3分钟创建一个Solana代币合约【pdf+视频SOL发币教程下载】
- ChainTool – 区块链开发者的工具箱 上线了
- Based Booster Rollup 的背景,实践和展望
- 零知识证明, SNARK与STARK 及使用场景
- 初探 Coinbase layer2 Base链 : Base链全新赛道上的潜力项目有哪些?
- 使用 Foundry 命令和脚本,快速部署与开源一个合约
- 监听以太坊地址余额的常用的方法
- 手把手教你用Gin框架写一个web服务
- Easy WP SMTP插件实现outlook邮箱发送邮件到用户注册邮箱
- solidity合约中使用create2方法提前计算部署的合约地址
- 详解以太坊地址生成实战
- zkEVM VS zkVM:一字之差,天壤之别!
- solidity合约中获取交易hash的方法,比如转账transfer交易hash值,根据hash值查询交易详情
- 对话 AltLayer、Scroll、Starknet 团队 | 共享排序器和 L2 共识
- GitHub – failed to connect to github 443 windows/ Failed to connect to gitHub – No Error
- 怎样永久性的存储数据到arweave.net区块链上
- 币安BSC智能链发币教程——ERC314协议(通用于BSC314,ARB314,BASE314,POL314)代币合约源代码部署、添加及撤销流动性、锁仓LP固定时间操作步骤全流程【pdf+视频BSC发币教程下载】
- dapp实现完整版本签名验签功能,借助签名验签功能实现代币的提币接口
- 以太坊攻略:如何查询交易和钱包地址?
- Solana链上在质押协议Solayer airdrop空投图文教程
- 区块链浏览器上输入地址类型数组变量作为输入参数时TRC20和ERC20的区别
- 比特币链上在质押项目Babylon airdrop空投积分图文教程
- 可升级合约中可以使用 immutable 变量么
- BTD存储公链 —— 历时三年新加坡比特米基金会重金,火爆来袭
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫