您正在查看: 2021年12月

Go多个pkg的单元测试覆盖率

在go test命令后面添加 -cover参数开启测试覆盖率统计,其结果如下:

ok models 0.012s coverage: 71.4% of statements in models

-coverpkg 标记来指定要被统计的代码包之后,未被指定的代码则肯定不会被统计,即使是被直接测试的那个代码包。go test -coverpkg=./... pkg2可以跑pkg2下的所有单元测试及pkg2所用到的其他包的覆盖率情况。
但是由于go不支持go test -coverpkg=./... ./...如果我们有多个pkg,则无法一次性统计出所有的测试覆盖率和跑完全部单元测试。所以需要挨个跑完单元测试然自己来合并覆盖率的结果:

src
├── pkg1
│   ├── pkg11
│   └── pkg12
└── pkg2
    ├── pkg21
    └── pkg22

go test -coverprofile=pkg1.cover.out -coverpkg=./... pkg1
go test -coverprofile=pkg1.cover.out -coverpkg=./... pkg2

-coverprofile用来指定统计测试覆盖率信息的输出路径,其内容如下:

mode: set
models/bot.go:32.40,46.18 12 1
models/bot.go:49.2,57.35 5 1
...

第一行是测试覆盖的mode,可取值为:set,count,atomic。剩下的行遵循以下的格式:
name.go:line.column,line.column numberOfStatements count
所以对每个pkg跑完单元测试后可以用以下的命令来合并:

echo "mode: set" > coverage.out && cat *.cover.out | grep -v mode: | sort -r | \
awk '{if($1 != last) {print $0;last=$1}}' >> coverage.out

然后用go自带的工具来将其输出为HTML:
go tool cover -html=coverage.out -o cover.html
把整个流程串起来写成脚本如下:

#!/bin/bash

set -e

profile="cover.out"
htmlfile="cover.html"
mergecover="merge_cover"
mode="set"

for package in $(go list ./...|grep -v src); do
    coverfile="$(echo $package | tr / -).cover"
    go test -covermode="$mode" -coverprofile="$coverfile" -coverpkg="$package" "$package"
done

# merge all profiles
grep -h -v "^mode:" *.cover | sort > $mergecover

# aggregate duplicated code-block data
echo "mode: $mode" > $profile
current=""
count=0
while read line; do
    block=$(echo $line | cut -d ' ' -f1-2)
    num=$(echo $line | cut -d ' ' -f3)
    if [ "$current" == "" ]; then
        current=$block
        count=$num
    elif [ "$block" == "$current" ]; then
        count=$(($count + $num))
    else
        echo $current $count >> $profile
        current=$block
        count=$num
    fi
done < $mergecover

if [ "$current" != "" ]; then
    echo $current $count >> $profile
fi

# save result
go tool cover -html=$profile -o $htmlfile
go tool cover -func=$profile

转载自:https://singlecool.com/2017/06/11/golang-test/

什么是以太坊eth伦敦升级?会带来哪些改变?

在过去数月里,以太坊核心开发者一直在进行伦敦网络升级的工作。它是继柏林升级(四月在主网实现分叉)后的一次升级。尽管各个网络的升级区块高度目前还未定,但纳入伦敦升级的 EIP 已经确定了。根据升级规范,EIP 如下:

➤ EIP-1559: Eth1.0 费用市场变更

➤ EIP-3198: BASEFEE 操作码

➤ EIP-3529: 减少gas返还

➤ EIP-3541: 拒绝以 0xEF 字节开头的新地址

➤ EIP-3554: 难度炸弹延迟至 2021 年 12 月

现在看看每个 EIP 的详细内容吧!

EIP-1559: Eth1.0 费用市场变更

EIP-1559 是以太坊史上最令期待的变更之一,也是伦敦升级里带来最大变更的EIP。这份 EIP 将在网络区块里引入“基本费用 (basefee)",它会追踪 gas 价格,这些价格来自网络将接受的、基于对区块空间需求的交易。这意味着钱包和用户将可以更容易预测他们交易的价格。另外,EIP-1559 新增了一种交易类型,用户可以指定他们愿意支付的最高限额,当他们把这个最高限额费用发送给矿工时,会获得最高限额费用减去基本费用与矿工小费之和的差值退款。最后,这份 EIP 还将导致部分交易费被烧毁,这一点被社区的大部分人认为是以太坊网络经济上的一个重要改善举措。

一篇简单的文章难以涵盖EIP-1559 的机制、裨益与影响。这份清单汇总了这份 EIP 各方面内容。还有关于 EIP-1559 的一期 PEEPanEIP, 这是完整视频。

EIP-3198: BASEFEE 操作码

这份 EIP 是与 EIP-1559 搭配的。它只是简单添加了一个BASEFEE操作码,它返回的是执行交易所在的区块的基本费用。这将使得智能合约可以在链上访问这个值,这有助于提交欺诈证明和创建去信任的 gas 价格衍生品。通过这期由Ratan Rai Sur 主讲的 PEEPanEIP,读者可以对这份 EIP 有一个全面的认识。

EIP-3529: 减少 gas 返还

在伦敦引入的另一个重大变更是取消了操作码SELFDESTRUCT 的 gas 返还和减少了操作码 SSTORE 的 gas 返还。虽然设立返还的初衷是希望激励开发者在可能的情况下清除状态,然而现实是,这导致了Gas Token的出现,反而增加了状态大小。利用这些返还的 gas,Gas Token 可以在 gas 价格很低的时候填满状态,然后在 gas 价格上升的时候获得执行这些交易的返还。

除此外,gas 返还还会导致区块执行时间的变化。在伦敦升级之前,多达 50% 的返还 gas 可以在同一个区块里进一步执行计算。也就是说,在实际上,最大的区块容量可达 1.5 倍的 gas limit。EIP-2539 把"执行 gas 返还"从 50% 下调到最多 20%。这一变更将有助于抵消由 EIP-1559 引入的额外区块大小变化,因为 EIP-1559 允许区块使用的 gas 是现在 gas limit 的两倍。

EIP-3541: 拒绝以 0xEF 字节开头的新地址

EIP-3541 是一个简单的变更,为以后更广泛的 EVM 改善奠定基础,想看 EIP-3540。这份 EIP 将使得以 0xEF 比特开头的新合约无法部署。现有的合约将不受影响。主网进行伦敦升级后,以 0xEF 开头的最短字节序列与现有合约的开头序列并不匹配,它们可以保留作为识别与 EIP-3540 语义相符的合同的方式。请注意:EIP-3540 将要求一次额外的网络升级来部署。值得注意的是,如果 EIP-3540 从未被部署,EIP-3541保留下来的开头字节也在其他方案里使用。

EIP-3554:2021难度炸弹延迟至2021年12月

EIP-3554 延迟难度炸弹,也以冰河时代为人所知。难度炸弹或冰河时代是以太坊引入的一种机制,在网络过渡到权益证明时”冻结“挖矿。由于权益证明的过渡还未准备好,我们需要推迟炸弹的”爆炸“时间。这在过去已经进行过三次:在大都会(EIP-649)、君士坦丁堡 (EIP-1234) 和穆尔冰川 (EIP-2384)。

尽管之前的延迟时间都相当长,但这次核心开发者选择了较短时间的延迟,把难度炸弹推迟到2021年12月。到时,网络不是要进行到权益证明的过渡就是另一次网络升级。

这就是纳入伦敦升级的整个变更列表了。测试网的升级区块高度和相关的客户端发布版本很快会在以太坊基金会博客上发布。

转载自:https://zhuanlan.zhihu.com/p/388789965

Transaction gasPrice (0) is too low for the next block, which has a baseFeePerGas of

问题描述

为了对比数据方便,排除发起交易gas消耗引起的账户余额差别,会将hardhat test 脚本中设置发起交易,设置gasPrice:0

await contract.withdraw({from: accounts[15], gasPrice: 0})

执行hardhat test时报以下错误

Transaction gasPrice (0) is too low for the next block, which has a baseFeePerGas of 8

解决方案

hardhat-config.js中设置initialBaseFeePerGas: 0

 networks: {
        hardhat: {
            ...
            initialBaseFeePerGas: 0
        }
    }

参考

https://github.com/nomiclabs/hardhat/issues/1216
https://github.com/nomiclabs/hardhat/blob/8e219bfc4112488953508eddd826d537bc71e803/docs/hardhat-network/reference/README.md

ubuntu 挂载新磁盘

  1. 查看是否有没有挂载的磁盘
    lsblk
  2. 格式化
    sudo mkfs.xfs /dev/vdb

    3.进行挂载

    sudo mount /dev/vdb /data

    4.查看是否挂载成功

    df -h 

    5.查看UUID

    lsblk -f
    NAME   FSTYPE  LABEL    UUID                                 FSAVAIL FSUSE% MOUNTPOINT
    sr0    iso9660 config-2 2021-12-23-15-00-00-00                              
    vda                                                                         
    ├─vda1                                                                      
    └─vda2 ext4             b986dc3b-6b82-44d5-acb8-6cbad5e357d5   42.9G     9% /
    vdb    ext4             0a3f332c-78d4-46dc-9843-c953447d048f  933.2G     0% /data

    6.通过修改/etc/fstab实现自动挂载,添加如下配置即可

    sudo vi /etc/fstab
    UUID=0a3f332c-78d4-46dc-9843-c953447d048f /data ext4 defaults 0 0

    添加完成后,执行sudo mount -a 即可生效

参考文档

https://www.cnblogs.com/logBlog/p/11981761.html
https://blog.51cto.com/u_12348890/2092339