一、简介 之前的文章中已经提到了ETH的转账相关内容,接下来,我们将使用智能合约,发布我们自己的Token,并实现Token的转账等相关操作。
下篇文章我会讲解一些关于事件日志、交易、区块监听相关的内容。
二、智能合约的书写 智能合约是使用Solidity书写的,具体学习可以查看官网。
Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性。
web3j可以自动生成智能合约包装器代码,以便在不离开JVM的情况下部署智能合约并与之交互。
下边实现一个简单合约:WEAF
三、合约类的生成
1.合约代码就不多说了,下表面我们使用solc来编译自己的代码
solcjs WEAF.sol--bin --abi --optimize -o ./WEAF
查看生成的文件
文章图片
2.通过abi接口文件使用web3j命令行工具生成Java合约类
web3j solidity generate --javaTypes WEAF_sol_WEAF.bin WEAF_sol_WEAF.abi -o WEAF.java -p top.weaf
文章图片
找到我们生产的合约类,然后更改类名称:WEAF
四、智能合约的部署与转账 1.部署合约
首先我们将WEAF.java copy到我们自己项目中,使用我们的钱包发起部署
Web3j web3j = Web3j.build(new HttpService("https://rinkeby.infura.io/v3/ac1907c0a9314f18967a9609570698ad"));
Credentials credentials =WalletUtils.loadCredentials(password,path);
ContractGasProvider contractGasProvider = new DefaultGasProvider();
WEAF contract = WEAF.deploy(web3j, credentials, contractGasProvider, "0xe3342d40dc85a7a0ed0984d89c8905ef491a25dd",new BigInteger("1000000000000000000000")).send();
String contractAddress = contract.getContractAddress();
log.info("Smart contract deployed to address " + contractAddress);
然后通过测试网络可以查看到我们部署的合约。
文章图片
2.合约转账
我们知道所有合约都是部署在以太坊上,发送各种交易都是需要花费矿工费(gas),所以在完成自己代币交易的同时,也需要花费eth作为矿工费。
所以要保证我们的交易完成,要确保账户中ETH充足。
实现代币转载的方法不止一种,我这里写下几种,大家可以选择着用
方法1 直接使用合约这是最简单,毋庸置疑。但是并不统用。
try {
Credentials credentials = WalletUtils.loadCredentials(password, filePath);
WEAF weaf = WEAF.load(contractAddress,web3j,credentials,new DefaultGasProvider());
TransactionReceipt receipt = weaf.transfer(to,amount).send();
log.info("转账成功,转账hash = {}",receipt.getTransactionHash());
return 1;
}catch (Exception e){
log.error("转账失败,错误信息 = {}",e);
return 0;
}
方法2 【使用Web3j(JAVA)开发ETH钱包-3】这种方法很统用,只需制定合约地址就可以。
try {
Credentials creds = WalletUtils.loadCredentials(password,filePath);
RawTransactionManager manager = new RawTransactionManager(web3j, creds);
String data = https://www.it610.com/article/encodeTransferData(to, amount);
BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
BigInteger gasLimit = Constants.GAS_LIMIT;
EthSendTransaction transaction = manager.sendTransaction(gasPrice, gasLimit, contractAddress, data, BigInteger.ZERO);
if (transaction.hasError()){
log.error("转账失败,失败原因:{}",transaction.getError().getMessage());
return null;
}
log.info("转账hash={}",transaction.getTransactionHash());
return transaction.getTransactionHash();
}catch (Exception e){
log.error("转账失败,失败原因:{}",e);
return null;
}
private String encodeTransferData(String toAddress, BigInteger sum) {Function function = new Function(
"transfer",
Arrays.asList(new Address(toAddress),
new Uint256(sum)),
Collections.>emptyList());
return FunctionEncoder.encode(function);
}
五、参考文章
- Solidity:https://solidity.readthedocs.io/en/develop/
- Solidity[中文版]:https://solidity-cn.readthedocs.io/zh/develop/
- How To Deploy Smart Contracts Onto The Ethereum Blockchain:https://medium.com/mercuryprotocol/dev-highlights-of-this-week-cb33e58c745f
- Remix(Solidity编程工具web):https://remix.ethereum.org
- Greeter:https://www.ethereum.org/greeter
- Web3j#Smart Contracts:https://web3j.readthedocs.io/en/latest/smart_contracts.html
推荐阅读
- 以太坊|King of the Ether
- ETH开发 JSONRPC
- ETH/ETC重定向开发者收费小工具,完美兼容所有Claymore内核挖矿软件
- ETHOS|现阶段4G显卡无法挖掘eth的解决方案
- 挖矿|Bminer 7.0.0 以太坊(ETH)挖矿教程(Linux 64)
- java --- ETH 冷热钱包转账测试
- 区块链|【交易所-数字货币】交易所充提币处理思路
- ETH 同步数据
- 区块链|【ETH】详细介绍搭建主网以太坊全节点钱包【推荐文章】
- ETH 钱包客户端