java实现比特币钱包_Java开发BTC钱包

java实现⽐特币钱包_Java开发BTC钱包⼀.⽐特币离线地址和私钥⽣成
下⾯是 BTC  离线⽣成地址和私钥的代码,废话不多说,直接上代码
package com.gingernet.bitcoin;
import com.gingernet.utils.Utils;
import Base58;
import ECKey;
import NetworkParameters;
import pto.HDUtils;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.TestNet3Params;
首次公开发行股票并在创业板上市管理暂行办法import org.bitcoinj.wallet.DeterministicKeyChain;
import org.bitcoinj.wallet.DeterministicSeed;
import org.bitcoinj.wallet.UnreadableWalletException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pto.digests.RIPEMD160Digest;傅汉思
import java.math.BigInteger;
import java.security.*;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECPoint;
import java.util.HashMap;
import java.util.Map;
public class Address {
private Logger logger = Logger(getClass());
static NetworkParameters params;
// ⽣成 WIF 格式的地址(中⼼化钱包使⽤)
public Map generateBtcAddress() {
NetworkParameters paramsTest = ();
//NetworkParameters params = ();
ECKey key = new ECKey();
Map btcMap = new HashMap<>();
btcMap.put("btcWifPk", PrivateKeyAsWiF(paramsTest));
btcMap.put("btcPk", PrivateKeyAsHex());
btcMap.put("btcPuKey", PublicKeyAsHex());
btcMap.put("btcAddress", Address(paramsTest).toString());
return btcMap;
}
// 由助记词⽣成地址流程(去中⼼化钱包使⽤)
public String CreateAddressByWord(String wordsList) throws Exception {
NetworkParameters params  = ();
DeterministicSeed deterministicSeed = new DeterministicSeed(wordsList, null, "", 0L);
DeterministicKeyChain deterministicKeyChain = DeterministicKeyChain.builder().seed(deterministic
Seed).build(); BigInteger privKey = KeyByPath(HDUtils.parsePath("44H / 1H / 0H / 0 / 2"), true).getPrivKey(); ECKey ecKey = ECKey.fromPrivate(privKey);
Address address = Address(params);
System.out.PrivateKeyAsWiF(params));
Base58();
}
// ⽐特币系列地址⽣成流程
public String bitcoinS(String version) {
try {
KeyPairGenerator keyGen = Instance("EC");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
keyGen.initialize(ecSpec);
KeyPair kp = ateKeyPair();
PublicKey pub = kp.getPublic();
PrivateKey pvt = kp.getPrivate();
ECPrivateKey epvt = (ECPrivateKey) pvt;
String sepvt = Utils.S().toString(16)).toUpperCase();
logger.warn("s[" + sepvt.length() + "]: " + sepvt);
logger.warn("私钥{}", sepvt);
ECPublicKey epub = (ECPublicKey) pub;
ECPoint pt = W();
String sx = Utils.AffineX().toString(16)).toUpperCase();
String sy = Utils.AffineY().toString(16)).toUpperCase();
String bcPub = "04" + sx + sy;
logger.warn("公钥{}", bcPub);
MessageDigest sha = Instance("SHA-256");
byte[] s1 = sha.Bytes("UTF-8"));
logger.warn("sha256后{}", Utils.byte2Hex(s1).toUpperCase());
RIPEMD160Digest digest = new RIPEMD160Digest();
digest.update(s1, 0, s1.length);
我爱比尔byte[] ripemd160Bytes = new DigestSize()];
digest.doFinal(ripemd160Bytes, 0);
logger.warn("ripemd160加密后{}", Utils.bytesToHexString(ripemd160Bytes));
byte[] networkID = new BigInteger(version, 16).toByteArray();
byte[] extendedRipemd160Bytes = Utils.add(networkID, ripemd160Bytes);
logger.warn("添加NetworkID后{}", Utils.bytesToHexString(extendedRipemd160Bytes));
byte[] twiceSha256Bytes = Utils.sha256(Utils.sha256(extendedRipemd160Bytes));
logger.warn("两次sha256加密后{}", Utils.bytesToHexString(twiceSha256Bytes));
byte[] checksum = new byte[4];
System.arraycopy(twiceSha256Bytes, 0, checksum, 0, 4);
logger.warn("checksum{}", Utils.bytesToHexString(checksum));
byte[] binaryBitcoinAddressBytes = Utils.add(extendedRipemd160Bytes, checksum);
logger.warn("添加checksum之后{}", Utils.bytesToHexString(binaryBitcoinAddressBytes));
String ltccoinAddress = de(binaryBitcoinAddressBytes);
logger.warn("地址{}", ltccoinAddress);
return ltccoinAddress;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
⼆. ⽐特币交易签名
获取⼿续费
在上⾯这个⽹站上可以看到当前的⼿续费是多少聪每⽐特,⼀般来说,⼀个中等的交易是225⽐特,⼿续费的结果是8550聪。但是许多钱包使⽤每千字节satoshis或每千字节⽐特币,因此您可能需要转换单位。
此处显⽰的费⽤为每字节交易数据的Satoshis(0.00000001 BTC)。 矿⼯通常⾸先包括费⽤/字节最⾼的交易。钱包应根据⽤户需要确认的速度,根据此数字进⾏费⽤计算。
也可以通过其他建议⼿续费⽹站获取,或者通过节点获取
下⾯是离线签名的代码,下⾯代码是测试⽹络的,若需要主⽹测试,直接替换即可package com.gingernet.bitcoin;
Collator;
import java.util.ArrayList;
import java.util.List;
import com.gingernet.api.po.UnSpentUtxo;
import dec.binary.Hex;
import figuration2.Configuration;
import Address;
import Coin;
import Context;
import DumpedPrivateKey;
import ECKey;
import NetworkParameters;
import Sha256Hash;
import Transaction;
import TransactionOutPoint;
import UTXO;
import Utils;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.TestNet3Params;
艺术人生侯耀文
import org.bitcoinj.script.Script;
CORBA.UNKNOWN;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import TransactionConfidence;
public class TransactionSign {
private static Logger LOG = Logger(TransactionSign.class); static NetworkParameters params;
static {
try {
params = (); // ();
LOG.info("=== [BTC] bitcoin  client networkID:{} ===", Id());
} catch (Exception e) {
LOG.info("=== [BTC] intype.btc.rawtransaction:{} ===", e.getMessage(), e);
}
国家基础教育资源网}
public String SignTransaction(String privKey, String recevieAddr, String formAddr, long amount, long fee, List unUtxos) { if(!unUtxos.isEmpty() && null != unUtxos){
List utxos = new ArrayList();
DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(params, privKey);
ECKey key = Key();
// 接收地址
Address receiveAddress = Address.fromBase58(params, recevieAddr);
// 构建交易
Transaction tx = new Transaction(params);
tx.addOutput(Coin.valueOf(amount), receiveAddress);
// 如果需要零 消费列表总⾦额 - 已经转账的⾦额 - ⼿续费
long value = unUtxos.stream().mapToLong(UnSpentUtxo::getValue).sum();
Address toAddress = Address.fromBase58(params, formAddr);
long leave  = value - amount - fee;
if(leave > 0){
tx.addOutput(Coin.valueOf(leave), toAddress);
}
/
/ utxos is an array of inputs from my wallet
for (UnSpentUtxo unUtxo : unUtxos) {
utxos.add(new UTXO(Sha256Hash.Hash()),
Coin.Value()),
false,
情报科学
new Script(Utils.HEX.Script())),
}
for (UTXO utxo : utxos) {
TransactionOutPoint outPoint = new TransactionOutPoint(params, Index(), Hash());

本文发布于:2024-09-23 04:17:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/173619.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地址   需要   特币   续费   交易   代码   获取   钱包
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议