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()))
网友评论