基于Docker的Ethereum 开发环境搭建

背景

最近在研究区块链相关的东西,作为一个程序员,当然想自己动手尝试一下。最后决定选择搭建一个Ethereum的开发环境,试着开发一下智能合约。
折腾了两天,觉得搭建一个开发环境依赖太多的东西,这样对一个刚入门的新手来说不够友好,所以最后决定使用Docker来搭建开发环境,部署起来也方便,而且不过分依赖本机的环境。
本文主要将了使用docker搭建起geth的集群,然后使用remix做为IDE来开发和调试合约。

阅读全文

go 基准测试和pprof的使用

基准测试

testing包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
func add(x, y int) int {
return x + y
}
// 控制执行次数
// 测试工具会逐步调整b.N的值,知道单词执行的累计时间超过了`-benchtime`,默认为1s
// output
// ~ go test -bench . -benchmem -run=NONE
// testing: warning: no tests to run
// 1
// BenchmarkAdd-4          100
// 10000
// 1000000
// 100000000
// 2000000000
// 2000000000               0.36 ns/op            0 B/op          0 allocs/op
// PASS
// ok      _/Users/wuzhenxing/Documents/dev/golang/bench   0.771s
func BenchmarkAdd(b *testing.B) {
println(b.N)
for i := 0; i < b.N; i++ {
_ = add(1, 2)
}
}
// 控制计时器的开关
// 比如在测试函数中某些操作不需要计入基准测试的时间,可以停止,开启,重置Timer等操作
func BenchmarkAddV2(b *testing.B) {
time.Sleep(time.Second)
b.ResetTimer() // 重置Timer
for i := 0; i < b.N; i++ {
_ = add(1, 2)
if i == 1 {
b.StopTimer() // 暂停Timer
time.Sleep(time.Second)
b.StartTimer() // 开始Timer
}
}
}

阅读全文

go内存分配

基于tcmalloc的基础数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// The allocator's data structures are:
//
// fixalloc: a free-list allocator for fixed-size off-heap objects,
// used to manage storage used by the allocator.
// mheap: the malloc heap, managed at page (8192-byte) granularity.
// mspan: a run of pages managed by the mheap.
// mcentral: collects all spans of a given size class.
// mcache: a per-P cache of mspans with free space.
// mstats: allocation statistics.
type mheap struct {
free [_MaxMHeapList]mSpanList // free lists of given length
freelarge mSpanList // free lists length >= _MaxMHeapList
busy [_MaxMHeapList]mSpanList // busy lists of large objects of given length
busylarge mSpanList // busy lists of large objects length >= _MaxMHeapList
sweepgen uint32 // sweep generation, see comment in mspan
sweepdone uint32 // all spans are swept
// central free lists for small size classes.
// the padding makes sure that the MCentrals are
// spaced CacheLineSize bytes apart, so that each MCentral.lock
// gets its own cache line.
central [_NumSizeClasses]struct {
mcentral mcentral
pad [sys.CacheLineSize]byte
}
}
type mcache struct {
// The rest is not accessed on every malloc.
alloc [_NumSizeClasses]*mspan // spans to allocate from
}
type mspan struct {
next *mspan // next span in list, or nil if none
prev *mspan // previous span in list, or nil if none
startAddr uintptr // address of first byte of span aka s.base()
npages uintptr // number of pages in span
stackfreelist gclinkptr // list of free stacks, avoids overloading freelist
}
type mcentral struct {
lock mutex
sizeclass int32
nonempty mSpanList // list of spans with a free object, ie a nonempty free list
empty mSpanList // list of spans with no free objects (or cached in an mcache)
}

阅读全文

Ratelimter

最初是因为要配置nginx的限速所以想研究一下限速的方法,nginx里用到了Leaky Bucket算法,下面记一下漏桶(Leaky Bucket)和令牌桶(Token Bucket)算法的区别。

漏桶算法

漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

阅读全文

虚拟存储器

从内存管理开始

在接下来的一段时间内,我们假定一个程序在执行时是全部加载到内存中的(包括动态加载和动态链接时加载到内存中的程序)。

阅读全文

awk

awk

简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

阅读全文

mysql的一些细节

范式和反范式

范式在有些本科的教材中将的其实挺晦涩的,比如《数据库系统概论》,后来在知乎上看到一个很好的答案: 关于范式

阅读全文

NSQD源码分析

NSQ是什么

NSQ is a realtime distributed messaging platform.

阅读全文

SkipList(跳表)

Why SkipList

目前经常使用的平衡数据结构有:B树,红黑树,AVL树等。
想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。
跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。

阅读全文

栈的一些巧妙应用

Create Maximum Number

阅读全文