美文网首页
Omni 官方构建Raw Tx指导

Omni 官方构建Raw Tx指导

作者: 马克_唐卡 | 来源:发表于2019-05-09 11:27 被阅读0次

原文:https://github.com/OmniLayer/omnicore/wiki/Use-the-raw-transaction-API-to-create-a-Simple-Send-transaction

kotlin实现:

        var rawTxBuilder = RawTxBuilder()
        
        // 1 list unspent outputs
        var utxoList = client2.listUnspent(0, 999999, "mmf3TtdKNHdV7byWVM4bpGbiRCVrVnB3Bd")

        // 2 construct payload
        var payload = rawTxBuilder.createSimpleSendHex(CurrencyID.OMNI, OmniValue.of(BigDecimal(1), PropertyType.DIVISIBLE))
//        var payload = hexToBinary(simpleSendHex)

        // 3 construct transaction base
        var inputList = ArrayList<Outpoint>()
        var outputList = HashMap<Address, Coin>()
        inputList.add(Outpoint(Sha256Hash.wrap(utxoList[0].txid()), utxoList[0].vout()))
        var transaction = client.createRawTransaction(inputList, outputList)
        var tx1 = Transaction(network, Hex.decode(transaction))

        // 4 attach payload output
        var opreturnList = ArrayList<Any>()
        opreturnList.add(transaction)
        opreturnList.add(payload)
        var payloadOutput = client.send<String>("omni_createrawtx_opreturn", opreturnList)
        var tx2 = Transaction(network, Hex.decode(payloadOutput))

        // 5 attach reference/receiver output
        var referenceList = ArrayList<Any>()
        referenceList.add(payloadOutput)
        referenceList.add("mrNhFGXmApPEk7KDw6a2mCt5GxLLQYKKr1")
        var referenTx = client.send<String>("omni_createrawtx_reference", referenceList)
        var tx3 = Transaction(network, Hex.decode(referenTx))


        // 6 specify miner fee and attach change output
        var changeList = ArrayList<Any>()
        var prevtxsList = ArrayList<Prevtxs>()
        prevtxsList.add(Prevtxs(utxoList[0].txid(), utxoList[0].vout(), utxoList[0].scriptPubKey(), utxoList[0].amount()))
        changeList.add(referenTx)
        changeList.add(prevtxsList)
        changeList.add("mmf3TtdKNHdV7byWVM4bpGbiRCVrVnB3Bd")
        changeList.add(0.0006)
        var changeTx = client.send<String>("omni_createrawtx_change", changeList)
        var tx4 = Transaction(network, Hex.decode(changeTx))

        // 7 sign transaction
        var signList = ArrayList<Any>()
        signList.add(changeTx)
        var signedTx = client.send<LinkedHashMap<String, Any>>("signrawtransaction", signList)
        var tx5 = Transaction(network, Hex.decode(signedTx["hex"].toString()))

        // 8 broadcast transaction
        var broadcastList = ArrayList<Any>()
        broadcastList.add(signedTx["hex"].toString())
        var broadcastTx = client.send<Any>("sendrawtransaction", broadcastList)

        //cf3d0c8b1ad757f2ade4cb3aec5ecbd9252884e95eb6c4e3ea0c89ca6091b874
        var test = 0

这里用rpc api调用,其实可以通过本地omnij库构建交易,这样可以减少网络交互:

       // 1 list unspent outputs
        var utxoList = client2.listUnspent(0, 999999, "mmf3TtdKNHdV7byWVM4bpGbiRCVrVnB3Bd")

        // 3 construct transaction base
        var inputList = ArrayList<Outpoint>()
        var outputList = HashMap<Address, Coin>()
        inputList.add(Outpoint(Sha256Hash.wrap(utxoList[0].txid()), utxoList[0].vout()))
        var transaction = client.createRawTransaction(inputList, outputList)
        var tx1 = Transaction(network, Hex.decode(transaction))

        // 4 attach payload output
        var op = BigDecimal(0.4).times(BigDecimal(10).pow(8)).toLong()
        tx1.addOutput(Coin.valueOf(0), Script(Hex.decode("6a146f6d6e69" + String.format("%016x", 1) + String.format("%016x", op))))

        // 5 attach reference/receiver output
        tx1.addOutput(Coin.valueOf(546), Address.fromBase58(network, "mrNhFGXmApPEk7KDw6a2mCt5GxLLQYKKr1"))

        // 6 specify miner fee and attach change output
        tx1.addOutput(Coin.valueOf(878908), Address.fromBase58(network, "mmf3TtdKNHdV7byWVM4bpGbiRCVrVnB3Bd"))

        // 7 sign transaction
        var ecKey = DumpedPrivateKey.fromBase58(network, "cQRYVgbejCX7ZdKHxk4jJjur45xxxxxxxxtPpm8oHCMik9WS").key
        tx1.inputs.forEach {
            var scriptPubKey = ScriptBuilder.createOutputScript(org.bitcoinj.core.Address.fromBase58(network, "mmf3TtdKNHdV7byWVM4bpGbiRCVrVnB3Bd"))
            var hash = tx1.hashForSignature(tx1.inputs.indexOf(it), scriptPubKey, Transaction.SigHash.ALL, false)
            var txSig = TransactionSignature(ecKey.sign(hash), Transaction.SigHash.ALL, false)
            it.scriptSig = ScriptBuilder.createInputScript(txSig, ecKey)
        }

        // 8 broadcast transaction
        // 7e1777ddfc8a5fa50bc7070c5a87217897d614982bafb922edcee54702591acd invalid
        // 267dbdbd9b2d35caef2a3f9b445151c6d025db94e56f85ecf334e0402b0ff710 valid
        var newBroadcastTxId = client.sendRawTransaction(NumericUtil.bytesToHex(tx1.bitcoinSerialize()))

相关文章

网友评论

      本文标题:Omni 官方构建Raw Tx指导

      本文链接:https://www.haomeiwen.com/subject/acazbqtx.html