在私链上使用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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值