흔자
article thumbnail
반응형

리눅스 서버에 geth를 세팅하고, geth attach로 console에 접속해서 명령어를 쳐본 경험이 있을 것이다.

geth attach geth.ipc

해당 명령어로 자바스크립트 콘솔에 접속하게 되면 여러 개의 web3, eth 명령어를 통해 이더리움 네트워크와 상호작용할 수 있게 된다.

 

 

geth attach 명렁어

geth attach는 이미 실행 중인 이더리움 노드에 JavaScript 콘솔을 연결하는 데 사용된다. 노드의 상태를 확인하거나 개발 중인 dApp과 상호작용하거나, 블록체인과 직접적으로 상호작용하는 등 다양한 작업을 수행할 수 있다. consolecmd.go의 remoteConsole 함수는 사용자가 입력한 endpoint (대개는 IPC 파일 경로 혹은 HTTP endpoint)에 연결을 시도한다. 연결이 성공하면, 해당 연결을 이용해 콘솔을 생성하고, 이를 통해 사용자의 입력을 받아 해당 노드에 전달한다. 

 

 

consolecmd.go

소스는 consolecmd.go의 remoteConsole 부분을 발췌한 것이다.

// remoteConsole will connect to a remote geth instance, attaching a JavaScript
// console to it.
func remoteConsole(ctx *cli.Context) error {
	if ctx.Args().Len() > 1 {
		utils.Fatalf("invalid command-line: too many arguments")
	}
	endpoint := ctx.Args().First()
	if endpoint == "" {
		cfg := defaultNodeConfig()
		utils.SetDataDir(ctx, &cfg)
		endpoint = cfg.IPCEndpoint()
	}
	client, err := utils.DialRPCWithHeaders(endpoint, ctx.StringSlice(utils.HttpHeaderFlag.Name))
	if err != nil {
		utils.Fatalf("Unable to attach to remote geth: %v", err)
	}
	config := console.Config{
		DataDir: utils.MakeDataDir(ctx),
		DocRoot: ctx.String(utils.JSpathFlag.Name),
		Client:  client,
		Preload: utils.MakeConsolePreloads(ctx),
	}
	console, err := console.New(config)
	if err != nil {
		utils.Fatalf("Failed to start the JavaScript console: %v", err)
	}
	defer console.Stop(false)

	if script := ctx.String(utils.ExecFlag.Name); script != "" {
		console.Evaluate(script)
		return nil
	}

	// Otherwise print the welcome screen and enter interactive mode
	console.Welcome()
	console.Interactive()
	return nil
}

 

if ctx.Args().Len() > 1 {
    utils.Fatalf("invalid command-line: too many arguments")
}

커맨드 라인의 인자의 수를 확인한다. 커맨드에 인자가 많이 입력된 경우에 해당 오류가 발생한다.

 

endpoint := ctx.Args().First()
if endpoint == "" {
    cfg := defaultNodeConfig()
    utils.SetDataDir(ctx, &cfg)
    endpoint = cfg.IPCEndpoint()
}

첫 번째 커맨드 라인 인자를 가져와 연결할 노드의 엔드포인트로 설정한다. 만약 인자가 제공되지 않았다면 기본 노드 설정을 사용하여 엔드포인트를 설정한다.

 

client, err := utils.DialRPCWithHeaders(endpoint, ctx.StringSlice(utils.HttpHeaderFlag.Name))
if err != nil {
    utils.Fatalf("Unable to attach to remote geth: %v", err)
}

RPC 연결을 시도하고, 만약 연결에 실패하면 에러 메시지를 출력하도록 한다.

 

만약에 geth attach라는 명령어만 치면 어떻게 될까?

인자가 제공되지 않았기 때문이 기본 노드 설정을 사용하고, 오류 메시지에는 기본 노드로 설정되어 있는 경로에 geth.ipc를 찾을 수 없다는 명령어가 나오게 된다.

 

console, err := console.New(config)
if err != nil {
    utils.Fatalf("Failed to start the JavaScript console: %v", err)
}

새로운 콘솔 인스턴스를 생성한다. 해당 인스턴스는 노드에 연결하고 명령을 실행하여 결과를 반환한다.

 

그렇다면 올바른 geth attach 명령어 사용법은 무엇일까?

geth 클라이언트를 실행하면 data directory로 지정한 곳에 geth.ipc가 생기게 된다. 해당 경로를 인자로 두고 geth attach 명령어를 실행하면 된다.

반응형
profile

흔자

@heun_n

즐겁게 개발하고 싶은 사람입니다.