在私鏈上使用go-ethereum發佈ERC20代幣合約

1.準備工具

準備好solc和abigen工具,可以參考使用go-ethereum操作簡單智能合約

項目完整代碼git地址

項目目錄

➜  erc20_demo tree -L 2 
.
├── UTC--2020-06-23T12-24-37.353894000Z--e0380828902269bfbce6b056ae3bfce8d52fd6a8
├── contracts
│   ├── ERC20Token.go
│   ├── ERC20Token.sol
├── deploy.go
├── go.mod
└── go.sum

2.部署合約到鏈上

準備一份合約文件,這裏參考OpenZeppelin模版寫的簡單版,僅用於測試。
contracts/ERC20Token.sol

確保solc命令可用後執行後生成ERC20Token.go文件(pkg指的是ERC20Token.go的package):

abigen -sol contracts/ERC20Token.sol -pkg contracts -out contracts/ERC20Token.go

調用DeployERC20Token方法部署合約,初始化200000000個代幣,name爲PokeCoin,縮寫PKC。

data, _ := ioutil.ReadFile(key)
auth, err := bind.NewTransactor(strings.NewReader(string(data)), "123456")
if err != nil {
	log.Fatalf("Failed to create authorized transactor:%v \n", err)
}
address, _, _, err := contracts.DeployERC20Token(
	auth,
	blockchain,
	big.NewInt(200000000),
	"PokeCoin",
	"PKC",
)
if err != nil {
	log.Fatalf("deploy %v \n", err)
}
fmt.Printf("Contract pending deploy:0x%x \n", address)

運行後得到一個合約地址和pending交易狀態,部署成功。

Contract pending deploy:0x367c02fe50380b36477f5bfa1701a3a06e393f17 

3.對代幣餘額查詢和轉賬

查詢代幣

在geth終端上運行miner.start()挖礦後,調用BalanceOf方法查詢在合約上的代幣餘額,得到餘額200000000。

accountBalance, err := contract.BalanceOf(nil, common.HexToAddress("0xf490774d9b87f4d379c2a789e5755156c1c370bc"))
	if err != nil {
		log.Fatalf("get Balances err: %v \n", err)
	}
fmt.Println(accountBalance)

代幣轉賬

簽名後生成轉賬交易,用當前賬戶auth.From的餘額給一個新的賬戶轉520個代幣。

tx, err := contract.Transfer(&bind.TransactOpts{
	From:   auth.From,
	Signer: auth.Signer,
	Value:  nil,
}, common.HexToAddress("0xf490774d9b87f4d379c2a789e5755156c1c370bc"), big.NewInt(520))
if err != nil {
	log.Fatalf("TransferFrom err: %v \n", err)
}
fmt.Printf("tx sent: %s \n", tx.Hash().Hex())

得到一個tx交易記錄。

tx sent: 0x6fbf00c5acb12cc07ef89eafcb1c5f57652ab7c74fd156f822280b49df4cdd44 

挖礦後再次查詢兩個用戶的餘額。

var accountBalance = big.NewInt(0)
if accountBalance, err = contract.BalanceOf(nil, auth.From); err != nil {
	log.Fatalf("get Balances err: %v \n", err)
}
fmt.Println(accountBalance)

if accountBalance, err = contract.BalanceOf(nil, common.HexToAddress("0xf490774d9b87f4d379c2a789e5755156c1c370bc")); err != nil {
	log.Fatalf("get Balances err: %v \n", err)
}
fmt.Println(accountBalance)

發現爲199999480和520,轉賬成功

➜  erc20_demo go run deploy.go
199999480
520

參考:
https://goethereumbook.org/zh
https://github.com/OpenZeppelin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章