dir : node/node.go
config를 깊은 복사해 datadir 속성 추가
confCopy := *conf
conf = &confCopy
if conf.Datadir != "" {
...
conf.DataDir = absdatadir
}
로깅, 인스턴스 이름의 포맷 확인
if conf.Logger == nil {
conf.Logger = log.New()
}
if strings.ContainAny(conf.Name, `/\\`) {...}
...
node 인스턴스 생성
// rpc.NewServer는 rpc.Server 인스턴스를 생성 (핸들러는 등록되지 않음)
// p2p.Server는 모든 peer connections을 관리
node := &Node{
config: conf,
inprocHandler: rpc.NewServer(),
eventmux: new(event.TypeMux),
log: conf.Logger,
stop: make(chan struct{}),
server: &p2p.Server{Config: conf.P2P},
databases: make(map[*closeTrackingDB]struct{}),
}
api 관련 인스턴스 추가 (admin, debug, web3)
// Register built-in APIs (admin, debug, web3)
// node.apis()는 내장 RPC APIs의 collection 반환
node.rpcAPIs = append(node.rpcAPIs, node.apis())
// dir : node/api.go
ws, http 등 p2p 통신 관련 설정 셋업
keyDir, isEphem, err := getKeyStoreDir(conf)
...
node.keyDir = keyDir
node.keyDirTemp = isEphem
...
node.http = newHTTPServer(node.log, conf.HTTPTimeouts)
node.httpAuth = newHTTPServer(node.log, conf.HTTPTimeouts)
node.ws = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts)
node.wsAuth = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts)
node.ipc = newIPCServer(node.log, conf.IPCEndpoint())
return node, nil