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,答案回 钱包,大家一起交流学习。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券