很久沒更新博客了。主要是最近在研究區塊鏈技術(炒幣),固然也成爲了一個小礦工,挖迅雷的玩客幣。不過前不久,迅雷宣佈將中止國內轉帳,而在31號的時候,大陸ip就沒法進行轉帳。嗨呀我這個暴脾氣啊。不讓轉那我就只能分析下錢包了java
更多精彩文章請關注:www.wrbug.comgit
鏈克(英文名LinkToken)(原來叫玩客幣)是玩客雲共享計算生態下的基於區塊鏈技術的原生數字資產,它的產生過程與玩客雲智能硬件、共享CDN的經濟應用有強關聯,必須經過玩客雲智能硬件分享網絡帶寬、存儲空間等資源來得到。在玩客雲共享計算生態系統中,它將成爲用戶交換可共享計算資源的媒介,保證用戶的權益和提供的計算資源對等。github
鏈克是基於以太坊的一種代幣,交易相關的和以太坊相似,只是鏈克並不在以太坊公鏈上。因此沒法使用以太坊的協議進行轉帳,經過抓包發現鏈克使用迅雷自有的服務器轉帳,可是協議和以太坊類似,算法也基本一致,本文只簡單分析流程。算法使用以太坊的開源庫。想更深刻了解,能夠研究以太坊的協議算法
給你們推薦一個視頻。很好的介紹了區塊鏈,看過了就很好理解下面的加密了json
前往觀看api
後面的算法將結合這個項目服務器
轉帳須要錢包文件,錢包密碼,轉帳地址和轉帳數量 轉帳前,須要對錢包文件進行解密,密碼錯誤沒法獲取。解密成功,獲取到wallet對象。網絡
wallet = CommonWallet.fromV3(keystore, password);
複製代碼
鏈克錢包使用的是v3版本,獲取成功後,請求獲取交易次數的接口,獲取到該錢包地址的交易次數,將交易次數+1做爲加密的一個參數,代碼中參數爲 txInd ,接下來獲取gas和gasLimit,在鏈克轉帳中。這兩個爲固定參數app
BigInteger gasLimit = new BigInteger("186a0", 16);
BigInteger gasPrice = new BigInteger("174876e800", 16);
複製代碼
其餘幣種能夠經過 eth_gasPrice 接口獲取,通常狀況gas跟轉帳速度有直接關係。而後將轉帳數量進行一次轉換
BigInteger amount = Unit.valueOf(Unit.ether.toString()).toWei(String.valueOf(tradeAmount));
複製代碼
獲取到這些參數後。須要對其進行加密。獲取到Transaction的一個對象,並用wallet進行簽名
Transaction tx = Transaction.create(toAddress.replace("0x", ""), amount, nonce, gasPrice, gasLimit, null);
tx.sign(wallet);
byte[] encoded = tx.getEncoded();
複製代碼
最後調用tx.getEncoded方法獲取到加密的hash,請求服務器進行支付便可
https://walletapi.onethingpcs.com
POST
Content-Type:application/json
{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0xe6637d20b74b7cce17d8eacf8516e85ee646fe74", "latest"],
"id": 1
}
//0xe6637d20b74b7cce17d8eacf8516e85ee646fe74 爲錢包地址
複製代碼
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x0"
}
//result 爲16進制餘額,須要處理,祥見代碼
複製代碼
https://walletapi.onethingpcs.com
POST
Content-Type:application/json
["0xe6637d20b74b7cce17d8eacf8516e85ee646fe74", "0", "0", "1", "10"]
//0xe6637d20b74b7cce17d8eacf8516e85ee646fe74 爲錢包地址
複製代碼
{
"totalnum": 73646,
"result": [{
"timestamp": "1517381448",
"type": 1,
"tradeAccount": "0x625251ec47f46e35edb1c2dde31c1711d7c3e4ce",
"amount": "0xa80d24677efef00000",
"cost": "0x0",
"hash": "0x5c9d52cba04dce07fa7fe63a9d7c1fd50bf0f72392309fb1d44dd9a3de4797a7",
"title": "",
"extra": "",
"order_id": "20180131145048tppfbj0qty8odx5v"
}]
}
//result 爲每條交易記錄
複製代碼
https://walletapi.onethingpcs.com
POST
Content-Type:application/json
{
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": ["0xe6637d20b74b7cce17d8eacf8516e85ee646fe74", "pending"],
"id": 1
}
//0xe6637d20b74b7cce17d8eacf8516e85ee646fe74 爲錢包地址
複製代碼
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x9"
}
複製代碼
https://walletapi.onethingpcs.com
POST
Content-Type: application/json NC: IN
{
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": ["0xf86d0985174876e...c3a7753869946bfe21ef822ee72d3a8218d4"],
"id": 1,
"Nc": "IN"
}
//0xf86d0985174876e...c3a7753869946bfe21ef822ee72d3a8218d4 一次交易的hash值
複製代碼
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x****"
}
//成功後返回 交易成功的hash值
複製代碼