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

相关文章
相关标签/搜索