Java对接(BSC)币安链 | BNB与BEP20的开发实践(一)环境搭建

本文为刚接触区块链且使用JAVA的程序员提供币安链开发实践教程,包括理解BEP20、使用Web3j库与BSC进行交互,以及基础的地址创建和转账操作,旨在解决开发中的困难和缺乏相关资源的问题。
摘要由CSDN通过智能技术生成

网内有很多关于币安链交易开发实例,但是打开一百篇,可能有百分之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交互转账、链上交易监控

bitcoinj项目富含完整demo 此项目使用maven构建,不会使用maven的同学,查看项目pom.xml文件,并在http://mvnrepository.com/下载相应的依赖jar包. demo:bitcoinj签名交易 /** * @param unSpentBTCList 未花费utxo集合 * @param from 发送者地址 * @param to 接收者地址 * @param privateKey 私钥 * @param value 发送金额.单位:聪 * @param fee 旷工费.单位:聪 * @return 签名之后未广播的原生交易字符串 * @throws Exception */ public static String signBTCTransactionData(List unSpentBTCList, String from, String to, String privateKey, long value, long fee) throws Exception { NetworkParameters networkParameters = null; // networkParameters = MainNetParams.get(); //测试网络 networkParameters = TestNet3Params.get(); Transaction transaction = new Transaction(networkParameters); DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(networkParameters, privateKey); ECKey ecKey = dumpedPrivateKey.getKey(); long totalMoney = 0; List utxos = new ArrayList(); //遍历未花费列表,组装合适的item for (UnSpentBTC us : unSpentBTCList) { if (totalMoney >= (value + fee)) break; UTXO utxo = new UTXO(Sha256Hash.wrap(us.getTxid()), us.getVout(), Coin.valueOf(us.getSatoshis()), us.getHeight(), false, new Script(Hex.decode(us.getScriptPubKey()))); utxos.add(utxo); totalMoney += us.getSatoshis(); } transaction.addOutput(Coin.valueOf(value), Address.fromBase58(networkParameters, to)); // transaction. //消费列表总金额 - 已经转账的金额 - 手续费 就等于需要返回给自己的金额了 long balance = totalMoney - value - fee; //输出-转给自己 if (balance > 0) { transaction.addOutput(Coin.valueOf(balance), Address.fromBase58(networkParameters, from)); } //输入未消费列表项 for (UTXO utxo : utxos) { TransactionOutPoint outPoint = new TransactionOutPoint(networkParameters, utxo.getIndex(), utxo.getHash());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大猩猩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值