-
Notifications
You must be signed in to change notification settings - Fork 0
/
公链和go笔记.txt
174 lines (130 loc) · 7.53 KB
/
公链和go笔记.txt
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
--公链 相关--
txpool
TxPool用來存放準備被寫入區塊的交易,包含 remote與 local
交易又分兩種
pending: 經過驗證(gas limit、nonce…等)後確定是可被執行的交易。
queued: 已被提交但還不能夠被執行,例如 nonce跳號。
控制台常用命令
txpool.status 查询待写入的数据
miner.start(1);admin.sleepBlocks(1);miner.stop(); 挖矿写入数据
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) 转账
eth.getBalance(eth.accounts[0]) 查询 账号 有多少币
eth.blockNumber:查询区块总数;
eth.getBlock(number) :根据区块号查看区块信息,number为区块号。
eth.getTransaction(txNo) 查询发起的交易详情 交易成功与否 不知道
eth.getTransactionReceipt(txNo) 查询交易执行情况 可以看event
eth.getTransactionFromBlock(number) 查询块 内的交易
eth.getTransactionCount(addr) 查看用户 nonce
admin.peers参数说明
network.inboud: true true 是站内连接 false 是站外连接
创建用户
geth.exe --datadir node1 account new
初始化节点
geth --datadir ./node1 init genesis.json
启动命令说明
--http --http.corsdomain="*" 跨域 使用浏览器可以访问节点
--http.port 8545 --http.addr "0.0.0.0" --http.api web3,eth,debug,personal,net 启动的模块
--allow-insecure-unlock 知道开启 http 的 对外开放
--ws --ws.addr "0.0.0.0" --ws.port 8546 WebSockets 服务
-ws.api web3,eth,debug,personal,net
--unlock 0x2dfb1e33c2e793e3c1f64a89b54758e307d5e7e3 --password pass.txt 解锁的账户 和密码
--mine 自动挖矿
--bootnodes enode://cddba93323aa548ff232ac14aea5104ecbf7544d43ecb9b1e76284985afface13cbd8cf71e7de7f6d72c635803e063f8af955e22ae0abd575c2b1b87f117194d@127.0.0.1:30310
这是路由节点 通过路由节点同步其他链
--verbosity 5 打印日志等级
--syncmode full 节点同步模式 full
windows 命令
--ipcdisable 进程复用 Disable the IPC-RPC server windows 启动时 复用 exe
--ipcpath data5/geth5.ipc 知道ipc ipc路径 在日志查看 日志-> IPC endpoint opened url=\\.\pipe\data5/geth5.ipc
windows 进入控制台
.\roninWindows.exe attach 'http://localhost:8551'
节点通信启动命令
./bootnode -genkey boot.key
./bootnode -nodekey boot.key -verbosity 9 -addr :30310 注意addr 后面要有空格
进入控制台 管道方式
.\geth.exe attach ipc:\\.\pipe\node2/geth2.ipc
--eth 源码相关--
api注册 一般都是每个模块的api.go中 然后找到注册函数 一般是tpye 下面的NEW...函数 一这个eth 转账相关函数 为例子 就是func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI
以太坊中关于区块同步和交换的代码位于eth目录下和les目录下。其中eth实现了所有的相关逻辑,而les只是light同步模式下的实现。这可以从cmd/utils/flags.go中的RegisterEthService函数中看出来:
--eth 共识相关--
每次发布新的区块链时,每个存有状态树的节点就会根据区块中的交易更新对应的账户树中的内容,每个节点根据区块上的交易独立的修改状态树,
最后生成状态树的根哈希值,随后用本地生成的状态树哈希值和新发布区块中的状态树的Root字段进行比较,如果相同,表示账户状态和发布区块的节点的账户状态保持了一致。
以太坊中每个节点独立的运行每个区块上的交易,随后验证区块,一个合法的区块,所有节点运行过后其账户状态就能保持一致。这就是以太坊中每个节点独立运行却又能维持区块链数据的一致性的原因。
Prepare() 初始化新Block的Header
Finalize() 在执行完交易后,对Block进行修改(比如向矿工发放挖矿所得)
Seal() 实际的挖矿工作
--go 语言相关--
init函数
init函数先于main函数自动执行,不能被其他函数调用;
init函数没有输入参数、返回值;
每个包可以有多个init函数;
包的每个源文件也可以有多个init函数,这点比较特殊;
同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
不同包的init函数按照包导入的依赖关系决定执行顺序。
两个main包 一个文件引用另一个文件使用
go run 1文件.go 2文件.go
make
golang 分配内存主要有内置函数new和make,今天我们来探究一下make有哪些玩法。
make只能为slice, map, channel分配内存,并返回一个初始化的值。首先来看下make有以下三种不同的用法:
1. make(map[string]string)
2. make([]int, 2)
3. make([]int, 2, 4)
&MyStruct{3, 4} 等于 new 结构体 等于初始化结构体
--go 打包相关--
go mod init 文件夹名 会在文件夹下 创建 go.mod 文件 意思 是项目用mod 形式进行依赖包管理
go mod tidy 下载依赖包命令
go get .. 手动下载依赖包
go mod 下载的包 放在gopath目录里
go mod vendor 当vendor 有依赖包 但是项目爆红无法找到时
go build 是编译go文件的命令 windows 编译成exe 文件 linux 编译成 linux的执行文件
---idea 相关 ---
windows 中添加环境变量 set DEBUG=true
idea 中配好启动配置 在edit 中 environment 中 DEBUG=true
a :=os.Getenv("DEBUG") 源码中 此处获取的是 系统环境变量的值
idea 配置go 项目
setting 设置中 go 下面
goroot go的路径 一般安装好go 后 idea 会自己找到的 目录D:\soft\go
gopath 可以每个项指定一个自己的gopath 也可用全局的 这里使用projiect GOPATH 设置到自己项目目录下 D:\work\projectTest\go-ethereum\gopath 不勾选 use GOPATH that's defined .... 和 index entire ..
GO Moudules(vgo) 勾选 enable Go Modules ... proxy 设置为GOPROXY=https://mirrors.aliyun.com/goproxy/,direct 不勾选 Vendoring mode (如果项目使用vendor 管理依赖 就勾选下)
代理报错 就换一个https://goproxy.cn,direct
编译geth 时 在cmd 控制台编译 此报错不影响打包 大致原因是go版本的问题 可忽略
duk_minimal_printf.c: In function 'duk__parse_pointer':
duk_minimal_printf.c:126:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
*out = (void *) val;
^
duk_minimal_printf.c: In function 'duk_minimal_vsnprintf':
duk_minimal_printf.c:236:76: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
off = duk__format_long(str, size, off, sizeof(void *) * 2, '0', 16, 0, (unsigned long) v);
--windows 相关--
删除 文件夹、文件 rmdir 文件夹名、文件名
使用终端工具 win+s 搜 终端
word 文档 删除 书签 直接在word自带的搜索中 输入书签
windows 终端启动命令 坑 unlock 后面的地址 不要加单引号 cmd 中需要加
--linux 相关--
Ctrl+S 暂停屏幕输出
Ctrl+Q 继续屏幕输出
构建命令 make all 是种类似打包脚本的命令 依赖文件Makefile 文件中写好执行命令脚本
手动修改验证者 代码
address[] public users ;
uint8 public users_count;
function getValidators() external override view returns(address[] memory) {
uint len = users.length;
address[] memory users2 = new address[](len);
for(uint i=0;i<len;i++){
if(users[i]!=address(0)){
users2[i]=users[i];
}
}
return users2;
}
function addValidators(address _user) external {
require(users_count < 5, "number of users is limited to 10");
//users[users_count] = _user;
users.push(_user);
users_count++;
}
function delValidators() external {
//users[users_count] = _user;
users.pop();
users_count--;
}