在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
在第一步的錢包中進行簽名(合約地址必須在哦,否則你的錢包和轉帳的地址沒的關係,也是不能簽名的)如圖下:
你看交易就成功了。不過這個是客服端的,與咱們要實現的離線簽名關係不大啊,放心磨刀不誤砍柴工工.....網絡
我也在看這個地址的時候: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,答案回 錢包,你們一塊兒交流學習。