![](https://img-blog.csdnimg.cn/20210624223416899.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Solidity和区块链进阶技巧
文章平均质量分 80
本专栏为Solidity进阶技巧和使用Node.js编写的一些区块链实用小工具。
AiMateZero
付费专栏里的部分内容被CSDN下架,请订阅过的小伙伴私信我联系补发原始文档!
展开
-
Openzeppelin可升级模板库合约初始化详解
本文详细的介绍了 Openzeppelin 代理/实现 模式中合约的初始化流程,并且讲了initializer,initialize,onlyInitializing 这三者的区别原创 2022-07-07 23:21:30 · 2030 阅读 · 2 评论 -
Solidity智能合约单元测试介绍
当前在各种区块链中,生态最全的要属兼容EVM的区块链,在该类区块链上的智能合约绝大部分使用Solidity编写。因此,对Solidity编写的智能合约进行单元测试便成为一项经常性的工作。本文简要的介绍一下怎样使用hardhat进行Solidity智能合约的单元测试。 一、什么是Hardhat 我们来看其官方文档的描述: Hardhat is a development environment to co............转载 2022-04-24 14:45:27 · 5782 阅读 · 3 评论 -
Solidity内嵌汇编学习(二)
学习Solidity内嵌汇编中的数组求和实现原创 2022-04-24 10:56:18 · 3289 阅读 · 0 评论 -
Solidity内嵌汇编学习(一)
简要学习solidity内联汇编的getCode功能实现。原创 2022-04-23 22:00:09 · 4013 阅读 · 0 评论 -
Solidity编码简要学习
Solidity编码简要学习solidity中函数编码按参数顺序,但是如果是动态类型,相应位置保存的是该动态类型元素的的起始位置。1、直接使用abi编码代码片断如下:function test2(address[] calldata pairs) external view returns(bytes memory) { uint[] memory pays = new uint[](3); pays[0] = 12345; pays[1] = 678910; pay原创 2022-03-26 22:19:07 · 1411 阅读 · 1 评论 -
Solidity全局变量完全测试
Solidity全局变量完全测试,看完你就明白了。基于Solidity 0.8.9和 hardhat 框架进行单元测试原创 2022-03-21 13:14:08 · 5755 阅读 · 0 评论 -
一种压缩Solidity函数参数的方法
当前Solidit合约调用时,会将函数参数进行扩展,填充无用的0至64位长度(32字节)。而我们仍然需要为这些填充的0支付相应gas。当参数很多并且参数的数据类型长度很小时,会造成很大的浪费。本文探索了一种压缩函数参数来节省gas的方法。原创 2022-02-26 23:44:21 · 3586 阅读 · 0 评论 -
Solidity代理/实现模式中实现合约回调函数的使用
我们知道,在Solidity中,合约有一个fallback函数,用于在函数调用时未匹配到相应的函数时调用。我们平常使用的代理/实现模式,正是基于这样一个功能。然而我们还可以在实现合约中继续使用fallback函数,来实现特定功能或者多重实现合约。原创 2022-01-18 19:25:11 · 5230 阅读 · 0 评论 -
Solidity示例合约ReceiverPays.sol学习
一、前言最近闲暇起来,打算把Solidity官方文档再看一遍,温故而知新!在看到示例合约微支付通道Micropayment Channel 时,决定动手去亲自实践一次(以前看到这只是看了源码,未真正部署测试)。没有想到,看上去挺简单的ReceiverPays合约却在一个地方卡了很久。以此文章记录这次ReceiverPays合约学习测试的过程,能给读者稍微提供一点点参考就足够了。本文以Solidity v0.8.0文档为阅读版本。Tips:Micropayment Channel 最终完成合约为Sim原创 2021-08-20 15:44:25 · 3089 阅读 · 1 评论 -
浅谈一下UniswapV3中的NFT图像生成
一、NFT与SVG今年打开UniswapV3中的周边合约,突然发现了一个NFTSVG.sol。正好自己以前也有研究过NFT与SVG之间的应用联系,就打开源码大致看了一下,果然如此。我们知道,NFT流行是从以太坊上的加密猫开始的,每个加密猫其实是一个ERC721的token,这个token又对应着一组数据结构,例如猫的主人,猫的眼睛颜色等。但是我们在前端显示的时候,这个猫眼睛到底是什么样子的,是前端图像组合的,也就是你的猫的图像其实是存于它们的网站上。后期有URL,每个token(猫)对应一个url地址,原创 2021-07-18 21:52:09 · 7437 阅读 · 5 评论 -
以太坊从公钥生成地址的具体过程
网上有大量的文章介绍了ECDSA(椭圆曲线加密)算法来生成以太坊公私钥对,进而生成一个唯一的以太坊地址。其中绝大部分都提到了非压缩公钥生成地址时先进行哈希运算,然后取后40位就是地址了。然而绝知此事要躬为。到底怎么哈希的,公钥和私钥的格式是什么,相信很多人和我一样不清楚!笔者因为在研究一个东西,需要顺带弄明白以太坊公钥生成地址的细节流程。笔者首先百度了一下,参考了知乎上面的一篇文章《以太坊的私钥、公钥、地址、账户》 。然而摸索半天之后,得不到文章中列出的结果。最后笔者将文章中的私钥导入到MetaMas.原创 2021-07-14 20:38:06 · 5583 阅读 · 9 评论 -
一种链下绕过非view限制直接读取智能合约某类特殊函数返回结果的技巧
一、前言我们知道,在智能合约中一般分为读取(view/pure)或者写入(改变状态)这两种类型。由于保护数据设置障碍的需要,有时合约开发者并不想别人查看他们的view函数返回值,于是在上面增加了调用者权限限制,更有甚者,故意通过某种技巧(或者是业务需要)将此函数变成非view/pure类型的函数,也就是一个交易。这样线下(前端或者脚本)调用此函数时就是一个交易,是无法直接得到函数返回结果的。在一篇文章《一种绕过管理员权限调用智能合约view函数的小技巧》中,我们介绍了绕过权限控制来读取view函数返回结原创 2021-06-29 23:42:37 · 767 阅读 · 4 评论 -
一种绕过管理员权限调用智能合约view函数的小技巧
在部分以太坊智能合约中,有时可以看到某些view函数被限定了管理员调用,以阻止其它人查看。其实这个限定基本上是无效的,本文介绍一下绕过这个限定调用相应的view函数的小技巧。注意:我们这里仅限view类型的函数(非改变状态的交易)。一、介绍有的时候,智能合约开发者由于需求,会将部分数据设置为私有类型,并且限定了只有管理员才能查看(例如一个随机数的种子,或者管理员地址)。这时我们又想知道这个数据怎么办?正常的函数调用肯定是无法验证调用者地址验证的,这里,我们就得想想办法了,利用ethers.js框架中.原创 2021-06-27 22:54:14 · 1261 阅读 · 2 评论 -
使用ethers.js直接读取智能合约中插槽内容
我在上一篇《代理/实现模式下合约插槽索引计算》中的最后,提到了一个合约示例,(BSC 区块链,地址为:0x4BfE9489937d6C0d7cD6911F1102c25c7CBc1B5A)不知道有没有读者有兴趣去看一下,在那个示例合约中,有一段代码我摘出来:/** * @return adm The admin slot. */ function _admin() internal view returns (address adm) { bytes32 slot = ADMIN_原创 2021-06-25 23:36:23 · 1820 阅读 · 1 评论 -
代理/实现模式下合约插槽索引计算
我们知道,以太坊上的合约具有不可更改特性(代码即法律),那么什么是不可更改呢?其实这是指部署的合约的字节码无法再更改了,但不代表合约的实现逻辑是无法更改的。一、什么是代理/实现模式那么怎么更改合约的实现逻辑呢?有一个办法是把合约的实现逻辑外包给一个独立合约,执行时调用这个外部合约。需要更改逻辑时,首先更改外部合约逻辑重新部署一个合约,然后在主合约中重新设置该外部合约的地址即可。采用上面这种办法其实相当于实现了合约的可升级功能,当前流行的代理/实现模式就是这样。主合约只是一个代理(Proxy)合约,.原创 2021-06-25 10:47:19 · 1067 阅读 · 1 评论