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

前言:

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

        在開發一個幣,你必定要熟悉他的交易流程,那樣你纔不會走彎路...由於我走了太多了java

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

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

        建立錢包前吧錢包客服端變成測試網的參考:https://docs.neo.org/zh-cn/network/testnet.htmlgithub

第二步:申請測試幣

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

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

        第一步中已經有連接說過多重簽名了轉帳了,你直接往你第一步中轉。再往你新建立的錢包轉,你發現這些都是不的出現沒的私鑰簽名的步驟的,都是直接簽名成功的。
        如今從新建立一個新的錢包B,吧生成的地址幹掉,直接建立合約地址。把裏面的錢轉到A,獲得如圖下
這一步很重要,拷貝出來保存好,後面分析數據,看明白別人的簽名dome都有很大的幫助。api

第四步:簽名和廣播

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

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

第五步:下載大神的dome

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

第六步:分析

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

wif是錢包的私鑰,經過錢包就能夠查到,在io.neow3j.examples.utils.LoadWallet能夠得到
ecKeyPair3是多餘的能夠幹掉,若是你只簽名一次,ecKeyPair2也能夠幹掉。
資產id的獲取:neow3j.getAccountStatedom

如今 說說:輸出的地址是什麼?我把客服端的交易拿來解析:地址: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,答案回 錢包,你們一塊兒交流學習。

相關文章
相關標籤/搜索