- ethclient 를 사용하면 RPC API 를 지원하는 노드에 연결할 수 있다.
// Use a local node:
cl, err := ethclient.Dial(“/tmp/geth.ipc”)
// Use infura:
infura := “wss://goerli.infura.io/ws/v3/xxxxxx”
cl, err := ethclient.Dial(infura)
// Use a non-local node:
cl, err := ethclient.Dial("<http://192.168.1.2:8545>")
- ethclient 의 Dial 은 raw rpc.Client 를 감싸는 객체를 반환한다.
// 번호로 블록 검색
ctx := context.Background()
block, err := cl.BlockByNumber(ctx, big.NewInt(123))
// 계정의 잔액 확인. nil 은 최신 블록을 의미한다.
addr := common.HexToAddress("0xb02A2EdA1b317FBd16760...")
balance, err := cl.BalanceAt(ctx, addr, nil)
// 계정의 다음 논스값 가져오기
nonce, err := cl.NonceAt(ctx, addr, nil)
to := common.HexToAddress("0xABCD")
amount := big.NewInt(10 * params.GWei)
gasLimit := uint64(21000)
gasPrice := big.NewInt(10 * params.GWei)
data := []byte{}
// 서명되지 않은 원시 트랜잭션 생성
tx := types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, data)
// 원시 트랜잭션에 서명하기 위해 16진수 문자열 암호키를 사용한다.
SK := "0x0000"
sk := crypto.ToECDSAUnsafe(common.FromHex(SK))
// Sign the transaction
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(nil), sk)
// TransactOpts 객체 생성하기
opts := bind.NewKeyedTransactor(sk)
// 개인키에 상응하는 주소(공개키, public key) 가져오기
addr := crypto.PubkeyToAddress(sk.PublicKey)
- 원시 개인키를 사용하거나, 하드웨어 키를 사용하기 원하지 않을 때, 개인키에 대한 암호화된 저장소로 keystore.Keystore 사용하는 방법이다.
// Open Keystore
ks := keystore.NewKeyStore("/home/matematik/keystore", keystore.StandardScryptN, keystore.StandardScryptP)
// 패스워드를 통해 새로운 계정 생성
acc, err := ks.NewAccount("password")
// 모든 계정 검색
accs := ks.Accounts()
// 특정 계정의 lock 해제
ks.Unlock(accs[0], "password")
// TransactOpts 객체 생성하기
ksOpts, err := bind.NewKeyStoreTransactor(ks, accs[0])
- TransactOpts 객체를 사용하여 트랜잭션에 서명할 수 있으며, 이 객체는 스마트컨트랙트와 상호작용하는데 필요하다.
// bind.TransactOpts 를 가지고 있다면, 트랜잭션에 서명할 수 있다.
sigTx, err := opts.Signer(types.NewEIP155Signer(nil), senderAddr, tx)
package main
import (
"context"
"fmt"
"log"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
conn, err := ethclient.Dial("RPC_URL")
if err != nil {
log.Fatalf("Oops", err)
}
ctx := context.Background()
tx, pending, _ := conn.TransactionByHash(ctx, common.HexToHash("TRANSACTION_HASH"))
if !pending {
fmt.Println(tx)
}
}