在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,答案回 钱包,你们一块儿交流学习。