給大家分享一下我實現的方法,肯定有缺點或漏洞,在慢慢完善改進,有大佬發現也可以指正一下~
首先在服務器上搭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是扣手續費的地址,這裏都可以用中心錢包的地址
參考學習地址: