给大家分享一下我实现的方法,肯定有缺点或漏洞,在慢慢完善改进,有大佬发现也可以指正一下~
首先在服务器上搭BTC,和USDT节点,这里注意,不能放在同一个服务器上跑这两个链,因为usdt是在btc协议之上改进的,默认同步端口都是8333会有冲突,如果你会docker,可以实现一台服务器同步两条链。
先说BTC:
我们先去获取btc测试币
不用翻墙的地址:
btc测试币获取,这个因为是别人手动拨币的,会有点慢。
先上pom依赖,
<dependency>
<groupId>com.github.briandilley.jsonrpc4j</groupId>
<artifactId>jsonrpc4j</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
public static JsonRpcHttpClient getInstance(){
try {
Base64 base64 = new org.apache.commons.codec.binary.Base64();
String auth = "rpcuser" + ":" + "rpcpwd";
byte[] textByte = auth.getBytes("UTF-8");
String cred = base64.encodeToString(textByte);
Map<String, String> headers = new HashMap<String, String>(1);
headers.put("Authorization", "Basic " + cred);
JsonRpcHttpClient client = new JsonRpcHttpClient(
new URL("http://服务器ip:8545"), headers);
return client;
}catch (Exception e){
e.printStackTrace();
return null;
}
1.给用户生成内部地址
我是用了btc原有的account来区分每一个用户,用他们的手机号作为一个account,注意启动命令需要带
-deprecatedrpc=accounts
client.invoke("getaccountaddress", new Object[]{account}, Object.class);
2.用户充币
因为btc提供了查询节点钱包里所有的交易记录,所以我们可以根据这个交易记录来判断用户是否充币
Object listtransactions = client.invoke("listtransactions", new Object[]{btcaccount, count,skip}, Object.class);
btcaccount让它为"*",就是查询所有账户
count 是返回的交易数
skip就是跳过多少条
这里有个注意的点,你用该命令去查询会发现它返回的数组是按区块确认倒序的,所以第一条也就是最新记录。
然后如何筛选出用户的充币交易记录
①在数据库存入每次钱包更新的交易条数
②然后在用该listtransactions查询最新的交易记录数,对比一下数量,看有没有多,在利用count,skip筛选出最新的交易记录
③遍历这些交易记录,第一条区块确认数没有超过6就可以直接跳出循环保持数据库原有记录数,等定时下次跑的时候在看他区块数有没有超过6
④如果超过6了,进行下一步筛选,如果交易记录发送与接受地址包括中心钱包地址就只数据库交易数加1(因为涉及到送手续费到内部地址),反之,则筛选出来的receive数据就是用户充币记录,根据这些充币记录,记录到用户虚拟资产上,并且充值币大于一定数量转到中心账户上,并交易数加1
⑤
3.用户提币
tarnhex = client.invoke("sendfrom", new Object[]{account,toaddress,amount}, Object.class);
这里多少可提币根据业务需求定
USDT:
usdt想要获取测试币先得给自己地址弄点btc测试币
1.向自己usdt测试地址转账btc测试币,在往moneyqMan7uh8FqdCA2BV5yZ8qVrc9ikLP发tbtc,一个 TBTC 可以收到 100 个 OMNI 和 100 个TOMNI。
2.usdt转账需要btc作为手续费的
测试网下usdt,propertyid为1或2,主链31
1.给用户生成内部地址
这里我没用账户作为区分,就是用地址区分,数据库保存绑定了,这个每次返回都是不同的地址,上面account地址,根据account返回的每次都是同一个。
getnewaddress = client.invoke("getnewaddress", new Object[]{}, Object.class);
2.用户充币
usdt与btc区别不大,就是返回交易记录不是倒序,命令前面加omni
listtransactions = client.invoke("omni_listtransactions", new Object[]{usdtaddress, count,skip}, Object.class);
usdtaddress让它为"*",就是查询所有地址交易记录
count 是返回的交易数
skip就是跳过多少条
然后如何筛选出用户的充币交易记录
①在数据库存入每次钱包更新的交易条数
②然后在用该omnilisttransactions查询最新的交易记录数,对比一下数量,看有没有多,在利用count,skip筛选出最新的交易记录
筛选逻辑和btc差不多,就是注意字段区分,根据自己业务来筛选
3.用户提币
tarnhex = client.invoke("omni_funded_send", new Object[]{fromaddress,toaddress,propertyid,amount,feeaddress}, Object.class);
前三个字段见名知意了,注意这里amount是string格式,feeaddress是扣手续费的地址,这里都可以用中心钱包的地址
参考学习地址: