前言:
对于钱包地址的校验,有很多方式:
1.热钱包可调用validateaddress json-rpc接口,参考 JSON-RPC
2.使用下面提供的工具类
1、Base58
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Arrays;
import org.apache.commons.codec.digest.DigestUtils;
public class BtcAddressChecker {
/*---- Class constants ----*/
private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
private static final BigInteger ALPHABET_SIZE = BigInteger.valueOf(ALPHABET.length());
/**
* 将 Base58Check 字符串反转为 byte 数组
*
* @param s
* @return
*/
static byte[] base58ToRawBytes(String s) {
// Parse base-58 string
BigInteger num = BigInteger.ZERO;
for (int i = 0; i < s.length(); i++) {
num = num.multiply(ALPHABET_SIZE);
int digit = ALPHABET.indexOf(s.charAt(i));
if (digit == -1) {
throw new IllegalArgumentException("Invalid character for Base58Check");
}
num = num.add(BigInteger.valueOf(digit));
}
// Strip possible leading zero due to mandatory sign bit
byte[] b = num.toByteArray();
if (b[0] == 0) {
b = Arrays.copyOfRange(b, 1, b.length);
}
try {
// Convert leading '1' characters to leading 0-value bytes
ByteArrayOutputStream buf = new ByteArrayOutputStream();
for (int i = 0; i < s.length() && s.charAt(i) == ALPHABET.charAt(0); i++) {
buf.write(0);
}
buf.write(b);
return buf.toByteArray();
} catch (IOException e) {
throw new AssertionError(e);
}
}
/**
* 双重Hash
*
* @param data
* @return
*/
public static byte[] doubleHash(byte[] data) {
return DigestUtils.sha256(DigestUtils.sha256(data));
}
/**
* @Title: base58ToBytes 验证钱包地址
* @param @param s
* @param @return 参数
* @return byte[] 返回类型
* @throws
*/
public static boolean base58ToBytes(String s) {
byte[] concat = base58ToRawBytes(s);
byte[] data = Arrays.copyOf(concat, concat.length - 4);
byte[] hash = Arrays.copyOfRange(concat, concat.length - 4, concat.length);
byte[] rehash = Arrays.copyOf(doubleHash(data), 4);
if (!Arrays.equals(rehash, hash)) {
throw new IllegalArgumentException("Checksum mismatch");
}
return true;
}
public static void main(String[] args) {
System.out.println(base58ToBytes("bc1q0mpzvyr7wrakn3lanc3lwfl4ey2696kh8pjwru"));
}
}
复制代码
2.调用 bitcoinj
/*
* address: 地址
* flag: 主链/测试链
*/
public static boolean validAddress(String address,boolean flag) {
try {
NetworkParameters networkParameters = null;
if (!flag)
networkParameters = MainNetParams.get();
else
networkParameters = TestNet3Params.get();
Address address = Address.fromBase58(networkParameters, address);
if (address != null)
return true;
else
return false;
} catch (Exception e) {
return false;
}
}
复制代码
转载于:https://juejin.im/post/5cf5ec78f265da1b6e658f4a