golang eth wallat

https://zhuanlan.zhihu.com/p/367285757 https://www.cnblogs.com/chris-cp/p/9046830.html https://github.com/ethereum/go-ethereum https://geth.ethereum.org/docs/rpc/server https://gist.github.com/gaoxt/2db081dd2696669c2e3b3807155bf42a 我們ip wsl go 連線到 windows 所以必須透過cat 拿到 對外ip

code
root@HOME-X213212:~/golang/mvc# cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.20.64.1

至於外部 geth server 必須要將 ip設為--rpcaddr 172.20.64.1 wsl 內部 golang 就可以連線到外部 windows geth server

geth

連線到兩年前的geth server

code
./geth --datadir data --networkid 123 --rpc --rpccorsdomain "*" --nodiscover --rpcapi="db,eth,net,web3,personal"  --rpcaddr 172.20.64.1  --rpccorsdomain "*"  --allow-insecure-unlock console --ipcpath geth.ipc --ws  --wsapi  "db,eth,net,web3,personal"

創世塊

code
{
    "config": {
        "chainId": 123,
        "homesteadBlock": 0,
  "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "nonce": "0x0000000000000042",
    "difficulty": "0x010",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0xffffffff",
    "alloc": {
   "0x21d10c5e114a959e6e92c6f5f0ffcbe7df7785f1": {"balance": "99999999999999999999999999999999"},
   "0x0000000000000000000000000000000000000002": {"balance": "222222222"}
 }
}
code
eth.accounts
code
["0x21d10c5e114a959e6e92c6f5f0ffcbe7df7785f1", "0x4d545c6c4f6e56c1defd223a8ff202dde9845b54", "0x0ad5f82c818842fc7d71d5f3016a4be55cd59ac7", "0x1c3f3c25928a0522c5c521e1c033f9d3ac409980", "0x80a900292c87bd532a00f09880148904b1534644", "0x997e7ed4a3c9fe6b46b09ccf85ea0e1716713231"]

getblance

以前java 還要引入ipc的檔案現在我們直接透過 外部開放的port 進行連線並查詢

code
    client, err := ethclient.Dial("http://172.20.64.1:8545")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("we have a connection")
    // _ = client // we'll use this in the upcoming sections
    account := common.HexToAddress("0x0000000000000000000000000000000000000002")
    balance, err := client.BalanceAt(context.Background(), account, nil)
    if err != nil {
        log.Fatal(err)
    }

查詢創世塊

geth transfer

code
personal.unlockAccount(eth.accounts[0])
var txHash = eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether") })
eth.getTransaction(txHash)
> miner.start(1)
true

// 等待交易塊被處理

> miner.stop()
true

我以為交易塊可能會影響挖礦速度 一共送了三個轉帳請求

golang transfer

https://www.gushiciku.cn/pl/pETX/zh-tw

code
func keyStoreToPrivateKey(privateKeyFile, password string) (string, error) {
    keyJSON, err := ioutil.ReadFile(privateKeyFile)
    if err != nil {
        fmt.Println("read keyjson file failed:", err)
    }
    unlockedKey, err := keystore.DecryptKey(keyJSON, password)
    if err != nil {
        return "", err
    }
    privKey := hex.EncodeToString(unlockedKey.PrivateKey.D.Bytes())
    addr := crypto.PubkeyToAddress(unlockedKey.PrivateKey.PublicKey)
    fmt.Println(addr)
    return privKey, nil

}
func main(){
    pk, err := keyStoreToPrivateKey("/root/golang/mvc/UTC--2020-01-03T05-58-33.219268500Z--21d10c5e114a959e6e92c6f5f0ffcbe7df7785f1", "654321")
    if err != nil {
        log.Fatal(err)
    }
    privateKey, err := crypto.HexToECDSA(pk)
    if err != nil {
        log.Fatal("privateKey ", err)

    }

    publicKey := privateKey.Public()

    publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
    if !ok {
        log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
    }

    fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)

    nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
    if err != nil {
        log.Fatal(err)
    }

    value := big.NewInt(200)  // in wei (1 eth)
    gasLimit := uint64(21000) // in units
    gasPrice, err := client.SuggestGasPrice(context.Background())
    if err != nil {
        log.Fatal(err)
    }

    toAddress := common.HexToAddress("0x997e7ed4a3c9fe6b46b09ccf85ea0e1716713231")
    var data []byte
    tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)

    chainID, err := client.NetworkID(context.Background())
    if err != nil {
        log.Fatal(err)
    }

    signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)
    if err != nil {
        log.Fatal(err)
    }

    err = client.SendTransaction(context.Background(), signedTx)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("tx sent: %s", signedTx.Hash().Hex())

}

交易id已經被收到 miner.start(4)

已經收到eth 轉帳。