用golang开发ethereum
之前看到一个用golang开发以太坊的教程 https://goethereumbook.org/zh/ 这个教程非常详细,然而它太陈旧了,目前很多go-ethereum函数接口已经有所修改。最明显的是,EIP1559之后,交易的格式的已经大不一样。因此,我基于上述教程,依据最新的go-ethereum(v1.10.26)对代码demo进行了修改。 用golang开发以太坊的一个好处是,可以很方便的查看和调试geth的源码,可以帮助我们更深入地理解以太坊的底层实现。 代码库为 https://github.com/CryptoRbtree/goeth-client 下面对主要功能做简单介绍。1 账户首先需要调用ethclient.DialContext连接一个rpc,这个rpc可以是外部服务商提供的公链rpc,也可以是本地区块链的。var ( ctx = context.Background() url = "https://eth-mainnet.g.alchemy.com/v2/" + os.Getenv("ALCHEMY_ID") client, err = ethclie...
用golang开发ethereum
之前看到一个用golang开发以太坊的教程 https://goethereumbook.org/zh/ 这个教程非常详细,然而它太陈旧了,目前很多go-ethereum函数接口已经有所修改。最明显的是,EIP1559之后,交易的格式的已经大不一样。因此,我基于上述教程,依据最新的go-ethereum(v1.10.26)对代码demo进行了修改。 用golang开发以太坊的一个好处是,可以很方便的查看和调试geth的源码,可以帮助我们更深入地理解以太坊的底层实现。 代码库为 https://github.com/CryptoRbtree/goeth-client 下面对主要功能做简单介绍。1 账户首先需要调用ethclient.DialContext连接一个rpc,这个rpc可以是外部服务商提供的公链rpc,也可以是本地区块链的。var ( ctx = context.Background() url = "https://eth-mainnet.g.alchemy.com/v2/" + os.Getenv("ALCHEMY_ID") client, err = ethclie...
RabbyWallet被盗的复现与简析
阅读本文之前,可以先阅读下面这篇文章,本文是基于下面这篇文章提供的材料对RabbyWallet的攻击进行复现和分析的。 https://learnblockchain.cn/article/4881 选取的攻击交易为 https://etherscan.io/tx/0x366df0c20e00666749b16ae00475b3c41834dc659ebb29e059aa9bffa892c038 这笔交易试图盗取6名用户的HOP代币资产,其中2人因为approve为0逃过一劫,另外4人的HOP代币全部被转走。1 RabbySwap的正常执行逻辑我们先来看一个正常的RabbySwap交易。 https://etherscan.io/tx/0x576e6e447a2ca0071451de056e0a03395fb11d26dd7c4fde566001785552e7c0大家可以看一下图中被我圈起来的部分,ZeroEx::sellToUniswap. 因为RabbySwap本身并没有流动池,所以它其实只是一个中转站,它还需要在自己的swap函数中调用其他dex的接口。在上面的例子中,调...
RabbyWallet被盗的复现与简析
阅读本文之前,可以先阅读下面这篇文章,本文是基于下面这篇文章提供的材料对RabbyWallet的攻击进行复现和分析的。 https://learnblockchain.cn/article/4881 选取的攻击交易为 https://etherscan.io/tx/0x366df0c20e00666749b16ae00475b3c41834dc659ebb29e059aa9bffa892c038 这笔交易试图盗取6名用户的HOP代币资产,其中2人因为approve为0逃过一劫,另外4人的HOP代币全部被转走。1 RabbySwap的正常执行逻辑我们先来看一个正常的RabbySwap交易。 https://etherscan.io/tx/0x576e6e447a2ca0071451de056e0a03395fb11d26dd7c4fde566001785552e7c0大家可以看一下图中被我圈起来的部分,ZeroEx::sellToUniswap. 因为RabbySwap本身并没有流动池,所以它其实只是一个中转站,它还需要在自己的swap函数中调用其他dex的接口。在上面的例子中,调...
利用ftx免费提现swap代币
这段时间出了一个XEN Crypto,把低迷了很长时间的以太坊gas再次拉高了。前几天偶然发现有人利用ftx提现刷XEN,主要就是部署一个智能合约,然后在receive函数里写自己想要执行的逻辑,这样一来,执行的gas费都是ftx为自己付。这个事情已经有人写过分析了,本文不再详述: https://mirror.xyz/x-explore.eth/M2BJgQJaj2JK0mAO9OecByja3tU7mKXbHR_Agjs-MjA 不过我并不认同这属于“对ftx的攻击”,也不认为这是ftx的bug。和ftx每日的总提现相比,这点提现gas损失对ftx来说实在不算大。有人认为ftx应该把提现的gas做更严格的限制(目前的gas上限应该是500000),不过有些智能合约钱包,本来就是需要在receive函数里做一些事情的,如果严格限制了,可能会影响这部分用户的体验。如果这点损失能引诱更多人质押ftt来换取每日免费提现次数,或许是ftx愿意看到的。 我这几个月一直在玩stepn,虽然这个项目就像渣男一样把玩家耍得团团转,不过看在它还是有一点督促健身的作用,目前还留有一点仓位。 下图是...
利用ftx免费提现swap代币
这段时间出了一个XEN Crypto,把低迷了很长时间的以太坊gas再次拉高了。前几天偶然发现有人利用ftx提现刷XEN,主要就是部署一个智能合约,然后在receive函数里写自己想要执行的逻辑,这样一来,执行的gas费都是ftx为自己付。这个事情已经有人写过分析了,本文不再详述: https://mirror.xyz/x-explore.eth/M2BJgQJaj2JK0mAO9OecByja3tU7mKXbHR_Agjs-MjA 不过我并不认同这属于“对ftx的攻击”,也不认为这是ftx的bug。和ftx每日的总提现相比,这点提现gas损失对ftx来说实在不算大。有人认为ftx应该把提现的gas做更严格的限制(目前的gas上限应该是500000),不过有些智能合约钱包,本来就是需要在receive函数里做一些事情的,如果严格限制了,可能会影响这部分用户的体验。如果这点损失能引诱更多人质押ftt来换取每日免费提现次数,或许是ftx愿意看到的。 我这几个月一直在玩stepn,虽然这个项目就像渣男一样把玩家耍得团团转,不过看在它还是有一点督促健身的作用,目前还留有一点仓位。 下图是...
Solidity学习——神奇的构造函数
之前分析过合约创建的过程 https://mirror.xyz/rbtree.eth/15XiwTWWFYdLdhf-QSqTWsPuZliIgpP1o-_bz0TdGbs 构造函数是一个特殊的函数,它只在合约部署的时候执行一次,部署之后的字节码是不包含构造函数逻辑的。在构造函数执行时,合约还没有被创建完成,那么此时如果访问这个合约的变量/函数,会发生什么事情呢?1 address(this)在构造函数里,能否获取合约地址?// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TestConstructor { address public addr; constructor() { addr = address(this); } } 在remix里部署后我们可以发现,addr的值的确是合约的地址,这说明在构造函数里,可以获取合约地址。 合约的部署实际上有两种方式,一种是传统的CREATE,一种是后来新增的CREATE2. https://github.com/ethereum/EIPs/blob/mas...
Solidity学习——神奇的构造函数
之前分析过合约创建的过程 https://mirror.xyz/rbtree.eth/15XiwTWWFYdLdhf-QSqTWsPuZliIgpP1o-_bz0TdGbs 构造函数是一个特殊的函数,它只在合约部署的时候执行一次,部署之后的字节码是不包含构造函数逻辑的。在构造函数执行时,合约还没有被创建完成,那么此时如果访问这个合约的变量/函数,会发生什么事情呢?1 address(this)在构造函数里,能否获取合约地址?// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TestConstructor { address public addr; constructor() { addr = address(this); } } 在remix里部署后我们可以发现,addr的值的确是合约的地址,这说明在构造函数里,可以获取合约地址。 合约的部署实际上有两种方式,一种是传统的CREATE,一种是后来新增的CREATE2. https://github.com/ethereum/EIPs/blob/mas...
Compound学习——DAO治理
Compound DAO治理投票的流程如下:Compound有2个版本的治理合约,分别是Alpha和Bravo。治理合约和时间锁timelock配合使用,以提升治理的安全性。治理代币是Comp,用户持有Comp代币即拥有投票权,也可以将投票权委托给别人。1 Comp代币Comp是Compound的治理代币,在DAO治理的提案、投票过程过都发挥着重要的作用。 Comp首先是一个ERC20代币,因此它像其他ERC20代币那样会有transfer、approve等功能,不过这里主要探讨和治理投票相关的部分。1.1 投票权委托首先看一下_delegate函数,这个函数只是简单记录了一下委托关系,主要的投票权转移在_moveDelegates。function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint96 delegatorBalance = balances[delegator]; delegates[del...
Compound学习——DAO治理
Compound DAO治理投票的流程如下:Compound有2个版本的治理合约,分别是Alpha和Bravo。治理合约和时间锁timelock配合使用,以提升治理的安全性。治理代币是Comp,用户持有Comp代币即拥有投票权,也可以将投票权委托给别人。1 Comp代币Comp是Compound的治理代币,在DAO治理的提案、投票过程过都发挥着重要的作用。 Comp首先是一个ERC20代币,因此它像其他ERC20代币那样会有transfer、approve等功能,不过这里主要探讨和治理投票相关的部分。1.1 投票权委托首先看一下_delegate函数,这个函数只是简单记录了一下委托关系,主要的投票权转移在_moveDelegates。function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint96 delegatorBalance = balances[delegator]; delegates[del...