针对ERC20,你真的了解吗?

• 我们下面使用在线 IDE Remix 来编写我们的智能合约:简单的发行 31415926 个 SOT tokens,支持简单的合约转账功能。

• Remix 是以太坊官方推荐和维护的 IDE 环境,支持浏览器在线开发、调试、编译,也支持本地部署该 IDE 环境。

下图为使用 Remix 开发 SOT 合约的环境:

针对ERC20,你真的了解吗?

在Remix 的 Editor 编辑器主要(通过 tab)显示了正在打开的一个或多个合约源码文件,Remix 也会自动编译合约代码,如果有编译错误,会在左边的 compile tab 页面显示。remix 的官方文档 详细介绍了 remix 的使用。

具体的合约代码如下:

针对ERC20,你真的了解吗?

针对ERC20,你真的了解吗?

上述代码支持基本的合约转账和合约代理转账功能,主要围绕两个数据成员balancesallowed 来实现,其中:

balance:主要使用 map 结构缓存账号的 token 余额;

allowed:采用二级 map 结构缓存 owner(一级 map key)授权给哪些 spender(二级 map key)可提取的 token 数 value;

编译和编码合约为 Java 代码

因为我们希望能够通过在 Java 代码中实现合约的部署和转账等功能,因为我们需要将合约转换成 Java 代码,这里采用 web3j 来转换。

web3j 转换需要提供合约的 .abi 和 .bin 文件,我们先用 solc 编译器来生成 sot.abi 和 sot.bin 文件,如下命令:

针对ERC20,你真的了解吗?

可以看到针对每个 contract 类都生成了对应的 .abi 和 .bin 文件。

Remix IDE 中也可以通过查看 details 来获取对应的 abi 和 bin 文件。如下图:

针对ERC20,你真的了解吗?

接下来使用 web3j 将合约转换为 Java 文件:

针对ERC20,你真的了解吗?

生成的 SOT.java 文件中生成了一个派生于 Contract 类的 SOT 合约类,该类中实现了 ERC20 token 规范的那些方法,代码摘略如下:

针对ERC20,你真的了解吗?

针对ERC20,你真的了解吗?

后续可以将生成的 SOT.java 文件导入至 Java 项目中。

• solidity 编译器的安装参考

• web3j 安装参考

使用 Web3j 部署合约

部署合约之前先要有个自己的钱包账号的,这个账号可以用 web3j 的 WalletUtils.generateLightNewWalletFile 来创建,如下:

针对ERC20,你真的了解吗?

刚创建好的钱包账号中的余额为 0,而部署合约是需要消耗一定的 ether 的,因此我们得先申请一点 ether,当然我们只能在测试环境下申请,在 rinkeby testnet 中,因为采用的是 PoA(clique) 共识机制,可以通过 faucet 提交如下三个支持的社交媒体的帖子URL,而对应的帖子内容中包括你需要申请 ether 的账号地址:

• A public tweet on Twittero

• A public Facebook posto

• A public Google+ link

具体的申请内容和方式请参考 How to get on Rinkeby Testnet in less than 10 minutes 的 Step 4。申请成功之后,我们的钱包账号中就可以查到余额了,如下为在 etherscan rinkeby testnet 中查看到的账号信息:

针对ERC20,你真的了解吗?

其中 Transactions Tab 中第一条交易记录就是在 faucet 申请的 ether 的账号。

好了,ether 来了,开始使用 web3j 部署 SOT 合约,如下代码:

针对ERC20,你真的了解吗?

其中 web3 为使用 Web3jFactory.build 构建的实例,如下代码为连接到 rinkeby 测试网络

针对ERC20,你真的了解吗?

finalCredentials为通过WalletUtils.load Credentials 从本地 keystore 加载的凭证,如下代码:

针对ERC20,你真的了解吗?

contract.getContractAddress() 在部署成功 SOT 合约之后返回对应的合约地址。部署成功之后,我们可以查看到对应的合约信息,如下图:

针对ERC20,你真的了解吗?

该合约信息页面中显示了 合约创建者(Contract Creator),ERC20 Token Contract 名称为 Steven Ocean Token(SOT),以及交易列表中显示了关联的首笔交易(To 显示的为 Contract Creation

),交易信息 如下图:

针对ERC20,你真的了解吗?

在交易信息的 Input Data 中其实承载的是 SOT 合约的 BIN 代码。另外,可以查看 SOT token 页面,如下图:

针对ERC20,你真的了解吗?

其中显示了 SOT token 的很多信息,包括如下几个关键信息:

Total Supply:token 总的供应量,这里为我们发行了 31415926 个 SOT;

ERC20 Contract:展示了 SOT token 对应的合约地址,即我们在上面看到的那个截图;

Token Holders:Token 持有者,下面的列表展示了持有 SOT 的账户地址列表;注:上图中的 Token Transfers 中的记录是在下一步(合约转账)中完成之后出现的。

合约转账 - 给好基友转点币

我是 SOT token 的创建者,我给自己发行了 31415926 个 token,下面给好基友转点过去。继续使用 web3j 如下代码:

针对ERC20,你真的了解吗?

调用成功后,会提交到以太坊网络中,在交易被确认之前,为 pending 状态,如下图:

针对ERC20,你真的了解吗?

在交易最终被确认,并被区块打包之后,如下图:

针对ERC20,你真的了解吗?

目前 Brahma Wallet 目前已经支持近 600 种 ERC20 Token 资产的管理和转账,并且后续还会借助于 IPFS 技术来动态支持更多优质项目的 ERC20 Token,另外,ERC20 Token 本质上也是智能合约,而因为智能合约漏洞导致的各种“悲剧”事件也一直层出不穷,因此在编写 ERC20 Token 的过程中,我们还是要注意避免一些常见的安全问题。附:BrahmaWallet 是一个完全开源、去中心化的钱包,真正的让用户安全放心的使用,我们钱包的源码地址是https://github.com/brahmaos/wallet


分享到:


相關文章: