网内有很多关于币安链交易开发实例,但是打开一百篇,可能有百分之80的相似度,而且完全是那种你翻版我,我盗版你的文章,根本无法进行参照开发。
对于一个刚接触区块链,又使用JAVA语言进行开发的程序员,做币安区块链的相关需求,那是相当的一个困难。
特此本人针对自己的开发经验,来详细的梳理下,如何用JAVA语言来实现币安链的开发实践。
首先我们来了解下币安链到底是个什么链。尤其是我们要搞清楚BEP20是什么,因为本人在开发过程中,遇到了问题,根本在全网上无法搜索到BEP20的相关JAVA开发关键词。
如搜索“Java对接Bep20开发” “Java BSC” 等等一系列词,搜索出来的都是相关解释,跟开发基本都不沾边,沾边的都是很少的几行代码,对于初学者或者初次接触区块链的开发人员来说,简直的毫无用处的回答。
如官网所说:BNB Chain是通过对Go Ethereum协议(Geth)的硬分叉,或者说是永久分叉而产生的。
既然它是ETH(以太坊)的分叉,那么币安链也是遵循ETH的开发组件,
ETH基本开发组件用到什么呢?Java使用Web3j
Web3j 是一个轻量级、高度模块化、响应式、类型安全的 Java 和 用于使用智能合约并集成的 Android 库 以太坊网络上的客户端(节点):
详细文档链接:
https://docs.web3j.io/
了解到这些,那么我们直接在我们的项目内引用web3j即可。
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.9.3</version>
</dependency>
<!-- 相关业务组件 -->
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>bitcoinj-core</artifactId>
<version>0.16.2</version>
</dependency>
引入组件之后,我们来进行了解下web3j。
1. 首先就是如何通过RPC获取到链接
@Bean
public Web3j web3j() {
return Web3j.build(new HttpService(BscUrl));
}
Web3j实例可以是RPC链接获取,也可以使用web3j的websocket连接获取。
2.简单的地址离线创建
/**
* path路径
*/
private final static ImmutableList<ChildNumber> BIP44_ETH_ACCOUNT_ZERO_PATH =
ImmutableList.of(new ChildNumber(44, true), new ChildNumber(60, true),
ChildNumber.ZERO_HARDENED, ChildNumber.ZERO);
/**
* 创建地址(离线)
*/
@Override
public Map<String, String> createBscAddress() throws Exception {
SecureRandom secureRandom = new SecureRandom();
byte[] entropy = new byte[DeterministicSeed.DEFAULT_SEED_ENTROPY_BITS / 8];
secureRandom.engineNextBytes(entropy);
//生成12位助记词
List<String> str = MnemonicCode.INSTANCE.toMnemonic(entropy);
//使用助记词生成钱包种子
byte[] seed = MnemonicCode.toSeed(str, "");
DeterministicKey masterPrivateKey = HDKeyDerivation.createMasterPrivateKey(seed);
DeterministicHierarchy deterministicHierarchy = new DeterministicHierarchy(masterPrivateKey);
DeterministicKey deterministicKey = deterministicHierarchy
.deriveChild(BIP44_ETH_ACCOUNT_ZERO_PATH, false, true, new ChildNumber(0));
byte[] bytes = deterministicKey.getPrivKeyBytes();
ECKeyPair keyPair = ECKeyPair.create(bytes);
//通过公钥生成钱包地址
String address = Keys.getAddress(keyPair.getPublicKey());
Map<String, String> stringMap = new HashMap<>();
stringMap.put("address", "0x" + address);
stringMap.put("privateKey", "0x" + keyPair.getPrivateKey().toString(16));
stringMap.put("publicKey", keyPair.getPublicKey().toString(16));
stringMap.put("mnemonic", str.toString());
return stringMap;
}
第一节我们主要是环境搭建,主要是为了能够快速的去开发,有些地方只是简单的介绍,比如ETH 、web3j等等这些,我们回来之后的文章详细的去了解。
下一节:代码实现BNB转账、BEP20交互转账、链上交易监控