Setelah anda mengetahui apa itu addressbitcoin, ScriptPubKey, private key, dan penambang (miner), maka anda juga bisa membuat transaksi pertama anda.
Mari kita mulai dengan melihat sebuah transaksi yang mempunyai TxOut, yang ingin anda transaksikan. seperti yang telah kita pelajari sebelumnya:
Buat sebuah project baru (>.net45) lalu install QBitNinja.Client NuGet.
Apakah anda sebelumnya telah generate private key sendiri? Apakah anda telah mengirim sejumlah bitcoin pada address tersebut? jika belum, jangan khawatir, kita akan mengulangi cara tersebut, sehingga anda juga bisa melakukannya:
Catat PrivateKey bitcoin, address, kirimkan sejumlah koin disana, dan catat juga ID transaksinya. Anda bisa cek ID transaksi itu di wallet anda, atau di blockexplorer seperti di blockchain.info.
Sekarang kita telah mempunyai semua informasi yang dibutuhkan untuk membuat transaksi. Ada sejumlah pertanyaan umum tentang transaksi yang berlangsung: darimana, kemana, dan berapa jumlahnya?
Dari mana?
Dalam hal ini, kita coba mengambil opsi yang kedua pada outpoint. Caranya seperti ini:
Untuk transaksi pembayaran, anda perlu mereferensikan outpoin di dalam transaksi. Anda bisa membuat transaksi itu seperti ini:
Kemana?
Untuk menjawab beberapa pertanyaan darimana, kemana, dan berapa jumlahnya?
Buatlah TxIn dan tambahkan ke dalam transaksi. Dan itulah jawaban dari pertanyaan "darimana".
Buatlah TxOut dan tambahkan itu kedalam transaksi untuk menjawab dua pertanyaan lainnya.
Berapa jumlahnya?
Misalnya jika anda ingin mengirim 0.5 BTC dari sebuah input transaksi sedangkan balance anda 1 BTC, maka sebenarnya anda mengirimkan seluruh koin anda (1 BTC)!
Contohnya bisa dilihat pada diagram di bawah, output transaksi anda output dituliskan 0.5 BTC kepada penerima (Hall of The Makers) dan 0.4999 kembali ke anda. Jadi pada dasarnya, saat anda mengirim koin 0,5 BTC, anda mengirimkan semua 1 BTC, baru sisanya dikembalikan. Lalu bagaimana dengan yang 0.0001 BTC? Itu adalah fee miner sebagai insentifnya, karena telah memasukkan transaksi anda ke block baru.
Sekarang coba tambahkan pesan feedback! Pesan ini tidak boleh lebih dari 40 bytes, atau membuat aplikasi itu crash.
Pesan feedback ini, dapat dicantumkan di dalam transaksi, dan akan muncul (setelah transaksi itu dikonfirmasi).
Lebih jelasnya, coba lihat contoh keseluruhan transaksi yang telah dilakukan ini, sebelum itu ditandatangani:
Saya punya 3 TxOut, 2 dengan value, 1 tanpa value (namun ada pesan). Anda bisa melihat perbedaan antara scriptPubKeys dari sebuah TxOuts yang normal, dan scriptPubKey dari TxOut yang dilampiri pesan:
Lihat lebih detail pada TxIn. Kita punya prev_out dan scriptSig disana.
Latihan: Coba anda cari bagaimana caranya untuk mendapat scriptSig sebelum anda membaca lebih jauh!
Coba lihat hash dari prev_out di blockexplorer: http:\/\/tbtc.blockr.io\/tx\/info\/e44587cf08b4f03b0e8b4ae7562217796ec47b8c91666681d71329b764add2e3
Di prev_outn adalah 1. Sejak kita mengindex dari 0, artinya saya ingin menghabiskannya pada output kedua dari transaksi itu.
Pada blockexplorer kita bisa dapat melihat address yang sesuai adalah: mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv and I can get the scriptSig from the address like this:
Menandatangani Transaksi Anda
Jika anda telah dapat membuat transaksi, maka tentu kita harus bisa menandatanganinya. Artinya, anda harus bisa membuktikan bahwa anda memiliki TxOut yang telah anda referensikan dalam input.
Penandatanganan ini cukup rumit, namun kita coba untuk membuatnya lebih simpel.
Pertama coba kita tengok kembali scriptSig dari in, bagaimana kita bisa mendapatkan kode itu. Yang perlu diingat, kita copypasted address tersebut dari blockexplorer. Sekarang, mari kita ambil kode itu dari QBitNinja transactionResponse:
Anda harus menggunakan private key anda untuk menandatangani:
Broadcast Transaksi
Selamat, karena anda telah berhasil menandatangani transaksi pertama anda! Sekarang tinggal bagaimana menyebar atau broadcas transaksi itu ke dalam jaringan (network), sehingga para penambang bisa mendengar transaksi tersebut.
Menggunakan QBitNinja:
Menggunakan Bitcoin Core Anda:
Menggunakan kode block itu akan menangani koneksi yang terputus ke node. Itu saja.
Anda juga dapat terhubung ke jaringan bitcoin secara langsung. Namun lebih baik anda terhubung pada node anda sendiri, agar lebih cepat dan mudah.
var client = new QBitNinjaClient(network);
var transactionId = uint256.Parse("e44587cf08b4f03b0e8b4ae7562217796ec47b8c91666681d71329b764add2e3");
var transactionResponse = client.GetTransaction(transactionId).Result;
Console.WriteLine(transactionResponse.TransactionId); // e44587cf08b4f03b0e8b4ae7562217796ec47b8c91666681d71329b764add2e3
Console.WriteLine(transactionResponse.Block.Confirmations);
var receivedCoins = transactionResponse.ReceivedCoins;
OutPoint outPointToSpend = null;
foreach (var coin in receivedCoins)
{
if (coin.TxOut.ScriptPubKey == bitcoinPrivateKey.ScriptPubKey)
{
outPointToSpend = coin.Outpoint;
}
}
if(outPointToSpend == null)
throw new Exception("TxOut doesn't contain our ScriptPubKey");
Console.WriteLine("We want to spend {0}. outpoint:", outPointToSpend.N + 1);
var transaction = new Transaction();
transaction.Inputs.Add(new TxIn()
{
PrevOut = outPointToSpend
});
TxOut hallOfTheMakersTxOut = new TxOut()
{
Value = new Money((decimal)0.5, MoneyUnit.BTC),
ScriptPubKey = hallOfTheMakersAddress.ScriptPubKey
};
TxOut changeBackTxOut = new TxOut()
{
Value = new Money((decimal)0.4999, MoneyUnit.BTC),
ScriptPubKey = bitcoinPrivateKey.ScriptPubKey
};
transaction.Outputs.Add(hallOfTheMakersTxOut);
transaction.Outputs.Add(changeBackTxOut);
// How much you want to TO
var hallOfTheMakersAmount = new Money(0.5m, MoneyUnit.BTC);
/* At the time of writing the mining fee is 0.05usd
* Depending on the market price and
* On the currently advised mining fee,
* You may consider to increase or decrease it
*/
var minerFee = new Money(0.0001m, MoneyUnit.BTC);
// How much you want to spend FROM
var txInAmount = receivedCoins[(int) outPointToSpend.N].TxOut.Amount;
Money changeBackAmount = txInAmount - hallOfTheMakersAmount - minerFee;
TxOut hallOfTheMakersTxOut = new TxOut()
{
Value = hallOfTheMakersAmount,
ScriptPubKey = hallOfTheMakersAddress.ScriptPubKey
};
TxOut changeBackTxOut = new TxOut()
{
Value = changeBackAmount,
ScriptPubKey = bitcoinPrivateKey.ScriptPubKey
};
BroadcastResponse broadcastResponse = client.Broadcast(transaction).Result;
if (!broadcastResponse.Success)
{
Console.WriteLine("ErrorCode: " + broadcastResponse.Error.ErrorCode);
Console.WriteLine("Error message: " + broadcastResponse.Error.Reason);
}
else
{
Console.WriteLine("Success! You can check out the hash of the transaciton in any block explorer:");
Console.WriteLine(transaction.GetHash());
}
using (var node = Node.ConnectToLocal(network)) //Connect to the node
{
node.VersionHandshake(); //Say hello
//Advertize your transaction (send just the hash)
node.SendMessage(new InvPayload(InventoryType.MSG_TX, transaction.GetHash()));
//Send it
node.SendMessage(new TxPayload(transaction));
Thread.Sleep(500); //Wait a bit
}