传送门:https://zhuanlan.zhihu.com/p/41523247
上一篇文章用不专业、入门的语言分享了一下笔者理解的代币价值。本文将讲述一下代币生态的运作、如何发行代币以及如何用一门常用的编程语言(Java)操作它。
虽然类似的文章一搜一大堆,但是根据笔者的实践,几乎很少有一篇文章可以真的把整个流程讲解的透彻,并且无障碍的实践落地,所以本文把实践后的内容从新整理,希望对感兴趣的小伙伴有所帮助。
代币生态
首先介绍一下代币生态的运作,先来介绍一个常见基于代币的商业模式,例如一个某APP的宣传语是“XX即挖矿,随时提现到钱包,发财就是这么容易”。这里提到几个点,挖矿、提现、发财。这个宣传语很有误导性,挖矿挖出来是啥,真的矿?提现到哪里,支付宝?怎么就发财了。
上一篇文章提到过,代币可以被几乎零成本的创造出来,然后存储在合约创建者的以太坊钱包中,这里挖矿挖出来的其实是项目方发行的代币。而提现也不是提现到微信支付宝,而是提现到以太坊钱包,而套现就需要把代币转移到交易所中去交易,至于能不能发财,就要看手里的代币和项目前景了。为了更明了,用如下图表示整个过程。
这个代币生态下主要分为APP内和APP外,APP的使用者,通过XX即挖矿获得代币,此时的代币还并不是真正以太坊网络上的代币,它只存在于APP的服务器中,和传统的积分并无两样。
然后用户可以通过“提现”操作,将代币提现到它的以太坊钱包中,而提现的实现就是通过代币智能合约。为什么不是,用户 XX 即挖矿的同时,就将代币发到用户的以太坊钱包呢?或许有的项目是这么做的吧,但是以太坊网络转账需要消耗GAS(以太坊),每笔代币转账需要消耗 0.001 - 0.002 以太坊(现价大概是5元左右),用户的每个“挖矿行为”都可能让她获得代币,频繁的转账成本很高,另外也不方便项目方锁仓之类的控制行为。
所以大多数的模式,都要走一个提现申请过程。提现会提到一个支持ERC20代币的钱包,例如imtoken。在钱包里的代币依然是一串数字,只有项目方将代币运作上交易所,才有可能交易套现。而代币的价格往往也和上市的交易所直接挂钩,如果运作上市知名交易所,如币安、火币等币价可能坚挺,如果是不知名的交易所,可能就命途多舛了。
有了可以交易该代币的交易所,用户将代币提现到交易所中,通过卖出代币获得USDT、ETH、BTC等硬通货数字货币,最后在法币交易板块(OTC)卖掉,收到法币完成套现。
是不是觉得这个模式就是空手套,零成本弄出一堆数字,然后用户进来疯狂的挖矿,至于最后能不能让用户赚到钱就看资本运作和二级市场表现了。记得周鸿祎伯伯说过一句话,XX比贩毒还赚钱,这种钱我们也要赚。所以下面的内容,就在技术上详细讲解下如何发行代币和如何用一个常用的编程语言操作它。
代币发行
前期准备:外网连接、以太坊钱包(MetaMask)、ERC20代币智能合约。
- 在 Chrome 插件商店搜索并安装 MetaMask
2. 运行后,用它来给我们初始化一个以太坊钱包。
为了测试,我们可以点击左上角切换到测试网络
发行数字货币需要消耗以太坊,在测试网络中可以免费获得测试所需的以太坊:
Ethernet Faucet,然后点 Send me 1 test ether! 即可。一会就有会一个以太坊转到你的账户,如果是在真是网络上,需要你去交易所买以太坊,然后提现到自己的MetaMask钱包,当然也可以用 MetaMask 导入有 以太坊 的钱包。
然后就可以发布智能合约了。这里我准备一份智能合约:
https://github.com/tianmz1987/dnc
这个合约看起来比较复杂,但是基本都是基于各种开源社区的合约内容改造的,如果你理解面向对象语言的话,合约的内容非常好理解,类似于Java的接口、继承等概念,最后要发布的智能合约DncToken,它继承并实现了若干个接口,除了ERC20标准接口外,同时具有总量限制,可以焚烧等特点,智能合约代码的继承树如下:
有了智能合约,然后把它发布到以太坊网络中。我们使用 Remix - Solidity IDE 网站来发布智能合约。MetaMask会把当前账户相关的信息填写到网站上,我们只需要把智能合约的代码粘贴进去,简单的改一下配置就可以了:
把网站当前使用的 solidity 编译器版本号改成和文件头一致,把Enable Optimization 去掉。然后切换到 Compile 页面,点击Start Compile。
最后在Run页面,点击 Deploy
然后会弹出 MetaMask 确认页面,输入一个 Gas 数量即可,点击Submit。
然后可以看到合约开始部署~
部署完毕后,点击那个合约,会帮你打开一个网站,查看合约详情:
点击合约地址,会跳转到合约校验发布页面,点击Verify And Publish
填写好下面信息,同时粘贴代码:
拉到最下面,然后确认即可。发布成功后,会看到如下页面:
然后在账户中,就可以看到如下内容了:
因为这份智能合约初始状态,只约定代币总量,要通过 mint (铸币) 函数调用,才会给某个账户铸币,并且铸币总量不能超过约定到代币总量,当然也可以通过转账功能,在铸币后给别的地址转账,那么如何用一个常用到编程语言操作代币智能合约呢,用Java为例做进一步说明。
Java操作代币
很多文章的操作方法,会安装一堆东西,例如以太坊本地运行环境之类,其实根本不需要,只要安装 solidity(智能合约编程语言)编译工具 solcjs 和 以太坊Java 接口工具 web3j 即可,和以太坊网络打交道的事情,可以通过网络完成。
首先安装基本工具:(Mac系统)
sudo npm install -g solc
brew tap web3j/web3j
brew install web3j
为Java项目添加依赖
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.5.0</version>
</dependency>
然后把智能合约文件放入Java项目的根目录,执行
#!/usr/bin/env bash
solcjs dnc.sol --bin --abi -o ./
web3j solidity generate --solidityTypes dnc_sol_DncToken.bin dnc_sol_DncToken.abi -o src/main/java -p org.bilan.module.asset.dnc
然后在Java项目的 org.bilan.module.asset.dnc 包中,就出现了智能合约的Java版啦~
然后用如下代码加载智能合约
package org.bilan.module.asset;
import org.bilan.module.asset.config.ContractConfig;
import org.bilan.module.asset.dnc.Dnc_sol_DncToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.DefaultGasProvider;
import java.math.BigInteger;
/**
* Created by Vic on 2018/8/5.
*/
@Componentpublic class ContractLoader {
@Autowired
private ContractConfig config;
private static Logger logger = LoggerFactory.getLogger(WithdrawJob.class);
public Dnc_sol_DncToken loadContract(){
try{
//以太坊基础设施网络申请访问 https://ropsten.infura.io
Web3j web3j = Web3j.build(new HttpService(config.getNet()));
Credentials credentials = WalletUtils.loadCredentials(
config.getPassword(), //钱包密码
config.getKeyStore()); //钱包的 keystore 文件
Dnc_sol_DncToken contract = Dnc_sol_DncToken.load(config.getAddress(), //合约地址
web3j, credentials, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT);
return contract;
}
catch (Exception e){
logger.error("load contract error", e);
return null;
}
}}
做几点解释,config.getNet() 配置,是在以太坊基础设施网络中申请的访问(https://infura.io),简单的注册后就可以使用它提供的 Access Key 访问到以太坊主网和测试网。钱包密码是创建钱包的时候创建的,MetaMask 不支持导出 keystore 文件,所以最开始使用 MetaMask 创建钱包看来不明智,我们需要在官网上可以申请钱包,然后用 MetaMask 导入。
https://www.myetherwallet.com/
Dnc_sol_DncToken.load 函数需要的 address 就是智能合约的部署地址了,前面的内容中有提到。
合约加载好了以后,就可以调用合约中的函数了,例如调用铸币函数(mint):
Integer decimal = contractConfig.getDecimals();
BigDecimal decimalPart = BigDecimal.TEN.pow(decimal);
BigDecimal amount = mintApplyVo.getAmount().multiply(decimalPart);
Address toAddress = new Address(mintApplyVo.getAddress());
TransactionReceipt receipt = dnc.mint(toAddress, new Uint256(amount.toBigInteger())).send();
值得注意的是,如果你要铸 100 个币,给智能合约的参数是 100 * pow( 10, decimal ), 这个decimal是智能合约内的一个参数,描述这个一个币的小数位数。
调用成功后,会返回 TransactionHash,用 TransactionHash 可以在 https://etherscan.io/ 上 找到交易的详细数据,这笔交易已经被打包到区块中了,它不能被篡改哦~
再来看一下转账的调用:
BigDecimal decimalPart = BigDecimal.TEN.pow(decimal);
BigDecimal amount = vo.getAmount().multiply(decimalPart);
Address toAddress = new Address(userWalletVo.getEthAddress());
TransactionReceipt receipt = dnc.transfer(toAddress, new Uint256(amount.toBigInteger())).send();
和 调用 mint 并没有什么两样,只不过这次使用 transfer 函数而已。通过铸币后,就可以在自己的钱包中看到这个代币啦,还可以转账给别人~
是不是觉得很简单~ 感兴趣的话可以自己试试哦,不过千万别搞什么ICO,如果你看了这个然后去发币搞ICO被判非法集资,我可是不会负责的~
转载自原文链接, 如需删除请联系管理员。
原文链接:5分钟教你发行ERC20代币和代币生态,转载请注明来源!