Skip to content

Commit 460b76c

Browse files
committed
feat(add transaction logic): add transaction logic
add transaction logic
1 parent 5284acc commit 460b76c

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ build-wallet:
99
build-keystore:
1010
@CGO_ENABLED=0 GOOS=linux go build -o bin/go-keystore learn/go-keystore/go-keystore.go
1111

12+
build-transaction:
13+
@CGO_ENABLED=0 GOOS=linux go build -o bin/go-transaction learn/go-transaction/go-transaction.go
14+
1215
run-client: build-client
1316
@./bin/go-client
1417

@@ -18,6 +21,9 @@ run-wallet: build-wallet
1821
run-keystore: build-keystore
1922
@./bin/go-keystore
2023

24+
run-transaction: build-transaction
25+
@./bin/go-transaction
26+
2127
coverage:
2228
@go test -v -cover ./...
2329

README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,48 @@ func ReadKeyFromKeyStore() {
147147
address := crypto.PubkeyToAddress(key.PrivateKey.PublicKey).Hex()
148148
fmt.Println("address:", address)
149149
}
150+
```
151+
152+
## make transaction concept
153+
154+
![transaction-concept](transaction-concept.png)
155+
156+
## implementation
157+
158+
```golang
159+
func Transfer(client *ethclient.Client, sender common.Address,
160+
receiver common.Address, transferAmount int64, senderPrivKey string) error {
161+
nonce, err := client.PendingNonceAt(context.Background(), sender)
162+
if err != nil {
163+
log.Fatal(err)
164+
}
165+
amount := big.NewInt(transferAmount)
166+
suggestGasPrice, err := client.SuggestGasPrice(context.Background())
167+
if err != nil {
168+
log.Fatal(err)
169+
}
170+
tx := types.NewTransaction(nonce, receiver, amount, 21000, suggestGasPrice, nil)
171+
chainId, err := client.NetworkID(context.Background())
172+
if err != nil {
173+
log.Println(err)
174+
return err
175+
}
176+
prvKey, err := crypto.HexToECDSA(senderPrivKey)
177+
if err != nil {
178+
log.Println(err)
179+
return err
180+
}
181+
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainId), prvKey)
182+
if err != nil {
183+
log.Println(err)
184+
return err
185+
}
186+
err = client.SendTransaction(context.Background(), signedTx)
187+
if err != nil {
188+
log.Println(err)
189+
return err
190+
}
191+
fmt.Printf("tx send: %s\n", signedTx.Hash().Hex())
192+
return nil
193+
}
150194
```

internal/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type Config struct {
1111
EthAddress string `mapstructure:"ETH_ADDRESS"`
1212
KeyStorePassword string `mapstructure:"KEY_STORE_PASSWORD"`
1313
KeyStorefile string `mapstructure:"KEY_STORE_FILE"`
14+
SenderPriveKey string `mapstructure:"SENDER_PRIVKEY"`
1415
}
1516

1617
var AppConfig *Config
@@ -25,6 +26,7 @@ func init() {
2526
failOnError(v.BindEnv("ETH_ADDRESS"), "fail on Bind ETH_ADDRESS")
2627
failOnError(v.BindEnv("KEY_STORE_PASSWORD"), "fail on Bind KEY_STORE_PASSWORD")
2728
failOnError(v.BindEnv("KEY_STORE_FILE"), "fail on Bind KEY_STORE_FILE")
29+
failOnError(v.BindEnv("SENDER_PRIVKEY"), "fail on Bind SENDER_PRIVKEY")
2830
err := v.ReadInConfig()
2931
if err != nil {
3032
log.Println("load from environment variable")
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"math/big"
8+
9+
"github.com/ethereum/go-ethereum/common"
10+
"github.com/ethereum/go-ethereum/core/types"
11+
"github.com/ethereum/go-ethereum/crypto"
12+
"github.com/ethereum/go-ethereum/ethclient"
13+
"github.com/leetcode-golang-classroom/golang-ethereum-sample/internal/config"
14+
)
15+
16+
func main() {
17+
client, err := ethclient.Dial(config.AppConfig.EthJsonRpcURL)
18+
if err != nil {
19+
log.Fatal(err)
20+
}
21+
defer client.Close()
22+
sender := common.HexToAddress("44e8c6ee2eaD166A03b93d4e2bA6F9d299f2Cf44")
23+
receiver := common.HexToAddress("95fe3f0a532a4feb1bc92c45d447ac66ac54b4d5")
24+
_, err = GetBalances(client, sender, receiver)
25+
if err != nil {
26+
log.Fatal(err)
27+
}
28+
// 1 ether = 1000000000000000000 wei
29+
// 0.1 ETH
30+
err = Transfer(client, sender, receiver, 100000000000000000, config.AppConfig.SenderPriveKey)
31+
if err != nil {
32+
log.Fatal(err)
33+
}
34+
_, err = GetBalances(client, sender, receiver)
35+
if err != nil {
36+
log.Fatal(err)
37+
}
38+
}
39+
40+
func GetBalances(client *ethclient.Client, sender, receiver common.Address) ([]*big.Int, error) {
41+
senderBalance, err := client.BalanceAt(context.Background(), sender, nil)
42+
if err != nil {
43+
log.Println(err)
44+
return nil, err
45+
}
46+
receiverBalance, err := client.BalanceAt(context.Background(), receiver, nil)
47+
if err != nil {
48+
log.Println(err)
49+
}
50+
fmt.Println("senderBalance:", senderBalance)
51+
fmt.Println("receiverBalance:", receiverBalance)
52+
return []*big.Int{senderBalance, receiverBalance}, nil
53+
}
54+
func Transfer(client *ethclient.Client, sender common.Address,
55+
receiver common.Address, transferAmount int64, senderPrivKey string) error {
56+
nonce, err := client.PendingNonceAt(context.Background(), sender)
57+
if err != nil {
58+
log.Fatal(err)
59+
}
60+
amount := big.NewInt(transferAmount)
61+
suggestGasPrice, err := client.SuggestGasPrice(context.Background())
62+
if err != nil {
63+
log.Fatal(err)
64+
}
65+
tx := types.NewTransaction(nonce, receiver, amount, 21000, suggestGasPrice, nil)
66+
chainId, err := client.NetworkID(context.Background())
67+
if err != nil {
68+
log.Println(err)
69+
return err
70+
}
71+
prvKey, err := crypto.HexToECDSA(senderPrivKey)
72+
if err != nil {
73+
log.Println(err)
74+
return err
75+
}
76+
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainId), prvKey)
77+
if err != nil {
78+
log.Println(err)
79+
return err
80+
}
81+
err = client.SendTransaction(context.Background(), signedTx)
82+
if err != nil {
83+
log.Println(err)
84+
return err
85+
}
86+
fmt.Printf("tx send: %s\n", signedTx.Hash().Hex())
87+
return nil
88+
}

transaction-concept.png

789 KB
Loading

0 commit comments

Comments
 (0)