ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
Ether.js+Web3modal基础使用
1.说明现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西用ether.js而不是web3.js的原因是简单,爽2.安装npm i web3modal npm i ethers //另外还需要安装对应wallet的包,自行搜索就行 3.连接钱包// MM默认就有,无需显式加入 const providerOptions = { walletconnect: { package: walletconnectProvider, options: { infuraId: "", }, }, }; //构建Web3Modal对象 const web3Modal = new Web3Modal({ //缓存provider cacheProvider: true, providerOptions, }); //连接wallet async function connect() { try { const web3ModalProvider = await web3Modal.connect(); provider = new ethers.pr...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
Ether.js+Web3modal基础使用
1.说明现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西用ether.js而不是web3.js的原因是简单,爽2.安装npm i web3modal npm i ethers //另外还需要安装对应wallet的包,自行搜索就行 3.连接钱包// MM默认就有,无需显式加入 const providerOptions = { walletconnect: { package: walletconnectProvider, options: { infuraId: "", }, }, }; //构建Web3Modal对象 const web3Modal = new Web3Modal({ //缓存provider cacheProvider: true, providerOptions, }); //连接wallet async function connect() { try { const web3ModalProvider = await web3Modal.connect(); provider = new ethers.pr...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
Subscribe to point
Subscribe to point
<100 subscribers
<100 subscribers
Share Dialog
Share Dialog
防止重入,涉及到交易的功能加锁先,反正solidity的锁开销很小,先加锁再说
防止重入,要记录状态的,先记录再转账
权限,每个函数都要想好给谁用的
只要是计算,就用safeMath
每个函数的调用要想想是否要校验成功,特别是转账
前端和后端的数据源只能以solidity为准,保证数据一致性,后端利用事件做到
考虑每个函数的可见性,能不暴露的就不暴露
能复制绝不手写,能抄袭绝不原创
如果可以的话用weth代替eth付款
检查-生效-交互
可能因不了解solidity的某些机制而导致的bug
这个老生常谈了,加锁,在重要步骤(如转账)前先修改状态
这个说是已经修复了,但还是老老实实用safeMath吧
call() 切换上下文,我->合约1->合约2,msg.sender的结果是合约1
delegatecall() 保持上下文,我->合约1->合约2,msg.sender的结果是合约我
区块链理论上无法产生随机数,要用的话用link提供的随机数
首先不要用transfer和send,因为这两个函数本来就是为了解决重入问题的,不完美。
call有个问题,失败的话不会报错,返回个false,所以一定要检查返回值
旷工可以改时间,导致bug。要求很高的话可以用block来确定,BAT币就是用的startBlock和endBlock来确定时间的。要求不怎么高的话可以用时间戳
如果a/b<1,会变成0,所以最好先变成高精度数字再计算
solidity能不for就千万不要for,能for也尽量不要for,总之就是不要for。solidity的for就像这句话一样又长又臭。首先太贵,贵到最后可能导致超过gas限制,合约就废了。而且效率不高
纯属写代码的人水平问题,开发经验问题。这些bug,很可能靠工具,审计是查不出来的。多了解别人的bug,以史为镜,自我反思
https://learnblockchain.cn/article/3946
这里讲得很详细,就是判断用错了变量。
反思:测试用例一定要覆盖全,每个逻辑在构思的时候就用小本子把可能出现的bug记录下来;写代码的过程中,再随时记录;产品,技术,测试最后再头脑风暴,查漏补缺,最后形成文档,case;还要内部code review,讲解,避免这些低级bug
没有验证签名是谁发过来的,并且签名有没有被用过
反思:这个bug我自己写的时候也没有注意到,还好NBA爆出来了,感恩。要注意所有的内容是否要有一次性的判断
空投的要求只需要瞬时拥有NFT,而不是持有一段时间,导致可以通过闪电贷撸走
反思:这个应该是设计问题,产品没想到可以这么玩。这个就考验产品、编程、测试人员经验了。
有人很久前保存了签名,很久之后NFT涨价了,就把签名直接传到合约里,结果NFT被低价买走。合约没有校验签名的过期时间
反思:设计问题,和ape正好相反,看来合约开发的思维要比传统项目多一个时间维度。要思考在很短或者很长的时间里合约是否安全。
burn的函数可见性是external而不是internal
反思:每个关键字都要酌情考虑
防止重入,涉及到交易的功能加锁先,反正solidity的锁开销很小,先加锁再说
防止重入,要记录状态的,先记录再转账
权限,每个函数都要想好给谁用的
只要是计算,就用safeMath
每个函数的调用要想想是否要校验成功,特别是转账
前端和后端的数据源只能以solidity为准,保证数据一致性,后端利用事件做到
考虑每个函数的可见性,能不暴露的就不暴露
能复制绝不手写,能抄袭绝不原创
如果可以的话用weth代替eth付款
检查-生效-交互
可能因不了解solidity的某些机制而导致的bug
这个老生常谈了,加锁,在重要步骤(如转账)前先修改状态
这个说是已经修复了,但还是老老实实用safeMath吧
call() 切换上下文,我->合约1->合约2,msg.sender的结果是合约1
delegatecall() 保持上下文,我->合约1->合约2,msg.sender的结果是合约我
区块链理论上无法产生随机数,要用的话用link提供的随机数
首先不要用transfer和send,因为这两个函数本来就是为了解决重入问题的,不完美。
call有个问题,失败的话不会报错,返回个false,所以一定要检查返回值
旷工可以改时间,导致bug。要求很高的话可以用block来确定,BAT币就是用的startBlock和endBlock来确定时间的。要求不怎么高的话可以用时间戳
如果a/b<1,会变成0,所以最好先变成高精度数字再计算
solidity能不for就千万不要for,能for也尽量不要for,总之就是不要for。solidity的for就像这句话一样又长又臭。首先太贵,贵到最后可能导致超过gas限制,合约就废了。而且效率不高
纯属写代码的人水平问题,开发经验问题。这些bug,很可能靠工具,审计是查不出来的。多了解别人的bug,以史为镜,自我反思
https://learnblockchain.cn/article/3946
这里讲得很详细,就是判断用错了变量。
反思:测试用例一定要覆盖全,每个逻辑在构思的时候就用小本子把可能出现的bug记录下来;写代码的过程中,再随时记录;产品,技术,测试最后再头脑风暴,查漏补缺,最后形成文档,case;还要内部code review,讲解,避免这些低级bug
没有验证签名是谁发过来的,并且签名有没有被用过
反思:这个bug我自己写的时候也没有注意到,还好NBA爆出来了,感恩。要注意所有的内容是否要有一次性的判断
空投的要求只需要瞬时拥有NFT,而不是持有一段时间,导致可以通过闪电贷撸走
反思:这个应该是设计问题,产品没想到可以这么玩。这个就考验产品、编程、测试人员经验了。
有人很久前保存了签名,很久之后NFT涨价了,就把签名直接传到合约里,结果NFT被低价买走。合约没有校验签名的过期时间
反思:设计问题,和ape正好相反,看来合约开发的思维要比传统项目多一个时间维度。要思考在很短或者很长的时间里合约是否安全。
burn的函数可见性是external而不是internal
反思:每个关键字都要酌情考虑
No activity yet