1. 程式人生 > >NEO 交易所錢包開發之離線簽名【區塊鏈】

NEO 交易所錢包開發之離線簽名【區塊鏈】

開發十年,就只剩下這套架構體系了! >>>   

前言:

        在2019年的3月之前我對鋪天蓋地的“區塊鏈”網路風暴,都只是一個耳朵進另一個就幫忙給丟了...可3月中旬的時候一份工作讓我決定去接觸他,畢竟馬大爺說過:在未來只有人工智慧(AI)和區塊鏈......我接到的第一個命令是做NEO(小蟻幣)的冷錢包,可是我看了官網連簽名都沒的,更不要說什麼冷錢包了,網上的資料收到的都是些沒的多大用處的東西...好方啊不過入職的第一個任務就要逃避了嗎?靜下心來慢慢看吧?

        在開發一個幣,你一定要熟悉他的交易流程,那樣你才不會走彎路...因為我走了太多了

第一步:下載客服端建立一個屬於自己錢包

        下載地址:https://github.com/neo-project/neo-gui/releases 我下載的:neo-gui-windows.zip(建立錢包那些就不說了唄,都是中文的,如果不會就放棄吧,把這步建立的錢包叫A)

        建立錢包前吧錢包客服端變成測試網的參考:

https://docs.neo.org/zh-cn/network/testnet.html

第二步:申請測試幣

        申請地址:https://neo.org/testcoin/apply 注意最後面的公鑰一定要填第一步中建立錢包後的地址對應的公鑰,這樣你才有這個公鑰,不然你拿了測試幣用不了(我就是吃了這個虧的),申請好了你就去看看他需求文件那些吧,一直等到你收到測試B的郵件。

第三步:根據郵件建立多重簽名地址和轉賬

        第一步中已經有連結說過多重簽名了轉賬了,你直接往你第一步中轉。再往你新建立的錢包轉,你發現這些都是不的出現沒的私鑰簽名的步驟的,都是直接簽名成功的。
        現在重新建立一個新的錢包B,吧生成的地址幹掉,直接建立合約地址。把裡面的錢轉到A,得到如圖下


這一步很重要,拷貝出來儲存好,後面分析資料,看明白別人的簽名dome都有很大的幫助。

第四步:簽名和廣播

        在第一步的錢包中進行簽名(合約地址必須在哦,不然你的錢包和轉賬的地址沒的關係,也是不能簽名的)如圖下:

你看交易就成功了。不過這個是客服端的,與我們要實現的離線簽名關係不大啊,放心磨刀不誤砍柴工工.....

第五步:下載大神的dome

        我也在看這個地址的時候:https://www.jianshu.com/p/286c3cca3048(裡面有很的多東西)
        在裡面的社群愛好中找到了:Guil博士在NEO DevCon介紹Neow3j Java庫
        去下載專案:https://github.com/neow3j/neow3j
        裡面官方的api基本都是實現了的,也有沒實現得哈

第六步:分析

        這步就很重要的了,找到dome中的io.neow3j.examples.ransactions.CreateRawTransactionMultiSig.java,這個就是簽名的東西了,就是我在客服端簽名轉賬的java內容了....這個是個多重簽名(這個就不多做解釋了百度哈)現在研究一下這些資料是什麼意思:

wif是錢包的私鑰,通過錢包就可以查到,在io.neow3j.examples.utils.LoadWallet可以獲得
ecKeyPair3是多餘的可以幹掉,如果你只簽名一次,ecKeyPair2也可以幹掉。
資產id的獲取:neow3j.getAccountState

現在 說說:輸出的地址是什麼?我把客服端的交易拿來解析:地址:https://sdk.nel.group/#解析簽名錢的那個記錄(我說儲存好的那個)中的hex,放到連結中的交易解析,我開始以為是私鑰,我加入了,簽名ok,廣播就錯誤了,多交易驗證出錯大致這個意思吧。在這墨跡了很長時間......於是重新看官方文件髮型neo是UTXO(百度明白是什麼意思)的,於是我查了地址資訊:https://neoscan-testnet.io/api/test_net/v1/get_balance/加簽名地址     髮型了unspent.txid,估計就是他了,試了下,廣播成功了,幣交易成功了。與是我加入到我的離線簽名專案中(只實現一次簽名):

終結:完成離線簽名

@RequestMapping("/neo/offline")
public class NeoController {
    @Autowired
	public NeoInfo NeoInfo;
    
    @ApiOperation(value = "NEO離線簽名", notes = "NEO離線簽名")
	@RequestMapping(value="/sign", method = RequestMethod.GET)
    public String sign(NeoParam param) {
		ECKeyPair ecKeyPair = ECKeyPair.create(WIF.getPrivateKeyFromWIF(NeoInfo.getWif()));
		
		String multiSigAddress = Keys.getMultiSigAddress(1,ecKeyPair.getPublicKey());
		
		RawVerificationScript verificationScript = Keys.getVerificationScriptFromPublicKey(1,ecKeyPair.getPublicKey());
		
		RawTransaction rawTx = RawTransaction.createContractTransaction(
                null,
                null,
                Arrays.asList(
                        new RawTransactionInput(param.getUnspentTxid(), 0)
                ),
                Arrays.asList(
                        new RawTransactionOutput(0, param.getOutputAssetId(), param.getOutValue(), param.getInputAddress()),
                        new RawTransactionOutput(1, param.getOutputAssetId(), param.getChangeValue(), multiSigAddress)
                )
        );
		// 序列化基本原始事務
        // 重要:沒有指令碼!
        byte[] rawTxUnsignedArray = rawTx.toArray();

        // 在三種可能的簽名中新增兩個簽名——這裡的順序很重要!
        List<RawInvocationScript> rawInvocationScriptList = new ArrayList<>();
        rawInvocationScriptList.add(new RawInvocationScript(Sign.signMessage(rawTxUnsignedArray, ecKeyPair)));
        rawTx.addScript(rawInvocationScriptList, verificationScript);
        byte[] rawTxSignedArray = rawTx.toArray();
		return Numeric.toHexStringNoPrefix(rawTxSignedArray);
    }
}

第一次接觸數字貨幣,很多專業術語都不知道,走了很多的彎路,後續繼續努力,開始別的幣了.....
有開發錢包的加群:340697945,答案回 錢包,大家