# Transaksi

> ([Mastering Bitcoin](https://github.com/bitcoinbook/bitcoinbook/)) Transaksi adalah bagian terpenting dari sistem bitcoin. Segala sesuatu yang lain di bitcoin dirancang untuk dapat memastikan bahwa transaksi itu dapat dilakukan, disebar ke dalam jaringan, divalidasi, dan kemudian ditambahkan ke ledger (Blockchain). Transaksi adalah struktur data yang menyandikan transfer nilai antar pengguna di dalam sistem bitcoin. Setiap transaksi merupakan entri publik di blockchain bitcoin ini. Menjadi sebuah pembukuan transaksi besar secara global.

Sebuah transaksi mungkin tidak punya penerima, atau bahkan mempunyai penerima lebih dari satu. **Begitu juga halnya dengan pengirim**. Pada Blockchain, pengirim dan penerima diabstraksikan dengan ScriptPubKey, seperti yang telah ditunjukkan pada bab sebelumnya.

Jika anda menggunakan Bitcoin Core, transaksi anda akan menampilkan seperti ini:

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSguVya00FFzjMe2p%2FBitcoinCoreTransaction.png?generation=1539518682916202\&alt=media)

Sekarang, kita jadi tertarik dengan munculnya **Transaction ID** pada transaksi diatas. Transaksi ID tersebut diatas adalah:

`f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94`

> **Catatan:** TransactionId is didefinisikan oleh SHA256(SHA256(txbytes))
>
> **Catatan:** JANGAN menggunakan TransactionId untuk menangani transaksi yang belum dikonfirmasi. TransactionId dapat dimanipulasi sebelum transaksi itu dikonfirmasi. Hal ini disebut dengan “Transaction Malleability.”

Anda dapat melihat transaksi itu pada blockexplorer seperti di blockchain.info: [https:\\/\\/blockchain.info\\/tx\\/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94](https://blockchain.info/tx/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94) Namun sebagai seorang developer, anda mungkin menginginkan layanan yang lebih mudah untuk *query* dan *parse*. Sebagai developer C# dan pengguna NBitcoin, Nicolas Dorier's di [QBit Ninja](http://docs.qbitninja.apiary.io/) akan menjadi pilihan terbaik anda. Ini adalah layanan web API open source, untuk query blockchain dan melacak wallet.\
QBit Ninja tergantung pada [NBitcoin.Indexer](https://github.com/MetacoSA/NBitcoin.Indexer) di relay dari Microsoft Azure Storage. Developer C# diharapkan menggunakan [NuGet client package.](http://www.nuget.org/packages/QBitninja.Client)

Jika anda melihat di sini: [http:\\/\\/api.qbit.ninja\\/transactions\\/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94](http://api.qbit.ninja/transactions/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94) Anda akan melihat *raw bytes* dari transaksi anda.

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSguY-8hluZthNlLj%2FRawTx.png?generation=1539518684580368\&alt=media)

Anda dapat parse hex transaksi itu dengan kode berikut:

```csharp
Transaction tx = new Transaction("0100000...");
```

Lalu cepatlah menutup tab tersebut, sebelum membuat anda ketakutan. QBit Ninja melakukan queri dari API dan memparse informasi tersebut, jadi anda bisa melanjutkannya dan install **QBitNinja.Client** NuGet package.

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSgu_d3ox5oUpf4fF%2FQBitNuGet.png?generation=1539518683932508\&alt=media)

Query transaksi by id:

```csharp
// Create a client
QBitNinjaClient client = new QBitNinjaClient(Network.Main);
// Parse transaction id to NBitcoin.uint256 so the client can eat it
var transactionId = uint256.Parse("f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94");
// Query the transaction
GetTransactionResponse transactionResponse = client.GetTransaction(transactionId).Result;
```

Tipe **transactionResponse** adalah **GetTransactionResponse**. Dijalankan melalui QBitNinja.Client.Models namespace. Anda bisa mendapatkan jenis **NBitcoin.Transaction** tersebut di sini:

```csharp
NBitcoin.Transaction transaction = transactionResponse.Transaction;
```

Sekarang mari kita lihat contoh untuk mendapat kembali ID transaksi itu dengan kedua \_classes \_ini:

```csharp
Console.WriteLine(transactionResponse.TransactionId); // f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94
Console.WriteLine(transaction.GetHash()); // f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94
```

**GetTransactionResponse** memiliki informasi tambahan tentang transaksi, seperti nilai dan scriptPubKey pada *inputs* yang akan dibelanjakan dalam sebuah transaksi.

Jadi yang paling beralasi pada hal ini adalah tentang **inputs** dan **outputs**. Anda dapat melihat sejumlah 13.19683492 Bitcoin telah terkirim pada ScriptPubKey:

```csharp
List<ICoin> receivedCoins = transactionResponse.ReceivedCoins;
foreach (var coin in receivedCoins)
{
    Money amount = (Money) coin.Amount;

    Console.WriteLine(amount.ToDecimal(MoneyUnit.BTC));
    var paymentScript = coin.TxOut.ScriptPubKey;
    Console.WriteLine(paymentScript);  // It's the ScriptPubKey
    var address = paymentScript.GetDestinationAddress(Network.Main);
    Console.WriteLine(address);
    Console.WriteLine();
}
```

Kami juga menulis beberapa informasi tentang RECEIVED COINS menggunakan QBitNinja's *class* GetTransactionResponse. **Latihan**: Tuliskan informasi yang sama tentang SPENT COINS menggunakan *class* QBitNinja's GetTransactionResponse!

Lalu mari kita lihat bagaimana kita bisa mendapatkan informasi yang sama tentang RECEIVED COINS menggunakan \_class \_NBitcoin's Transaction.

```csharp
var outputs = transaction.Outputs;
foreach (TxOut output in outputs)
{
    Money amount = output.Value;

    Console.WriteLine(amount.ToDecimal(MoneyUnit.BTC));
    var paymentScript = output.ScriptPubKey;
    Console.WriteLine(paymentScript);  // It's the ScriptPubKey
    var address = paymentScript.GetDestinationAddress(Network.Main);
    Console.WriteLine(address);
    Console.WriteLine();
}
```

Sekarang mari kita periksa di **inputs**. Jika anda melihatnya, maka disana akan ada referensi output sebelumnya. Jadi pada setiap input dapat menunjukkan pengeluaran sebelumnya yang telah ditransaksikan pada transaksi ini.

```csharp
var inputs = transaction.Inputs;
foreach (TxIn input in inputs)
{
    OutPoint previousOutpoint = input.PrevOut;
    Console.WriteLine(previousOutpoint.Hash); // hash of prev tx
    Console.WriteLine(previousOutpoint.N); // idx of out from prev tx, that has been spent in the current tx
    Console.WriteLine();
}
```

Istilah **TxOut**, **Output** dan **out** maknanya sama.\
Jadi tidak perlu bingung dengan **OutPoint**, akan dijelaskan lebih lanjut.

Singkatnya, TxOut merupakan jumlah bitcoin dan **ScriptPubKey**. (Penerima)

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSgufuCrM2qp4ceNZ%2FTxOut.png?generation=1539518685084084\&alt=media)\
Sebagai ilustrasinya, mari kita membuat sebuah txout dengan 21 bitcoin dari ScriptPubKey pertama dalam transaksi kami saat ini:

```csharp
Money twentyOneBtc = new Money(21, MoneyUnit.BTC);
var scriptPubKey = transaction.Outputs.First().ScriptPubKey;
TxOut txOut = new TxOut(twentyOneBtc, scriptPubKey);
```

Setiap **TxOut** secara unik menunjuk address di level blockchain oleh ID transaksi yang meliputinya, dan juga index di dalamnya. kami menyebut referensi tersebut dengan **Outpoint**.

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSguh8yd0WvStTqgk%2FOutPoint.png?generation=1539518684412595\&alt=media)

Sebagai contoh, **Outpoint** dari **TxOut** dengan 13.19683492 BTC pada transaksi kami adalah (4788c5ef8ffd0463422bcafdfab240f5bf0be690482ceccde79c51cfce209edd, 0).

```csharp
OutPoint firstOutPoint = spentCoins.First().Outpoint;
Console.WriteLine(firstOutPoint.Hash); // 4788c5ef8ffd0463422bcafdfab240f5bf0be690482ceccde79c51cfce209edd
Console.WriteLine(firstOutPoint.N); // 0
```

Sekarang mari kita lihat lebih dekat pada input (di **TxIn**) dari transaksi itu:

![](https://2440072777-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL8tJw-d5SofMbn7lYp%2F-LOmSZOB-9J_6aKoXEGw%2F-LOmSguj9kayPapxvpPu%2FTxIn.png?generation=1539518684413248\&alt=media)

**TxIn** terdiri dari **Outpoint** pada **TxOut** yang telah dikeluarkan atau dibelanjakan dari **ScriptSig** ( kita dapat melihat disini bahwa ScriptSig berfungsi sebagai “Proof of Ownership”) Pada transaksi kami yang sebenarnya, ada 9 input.

```csharp
Console.WriteLine(transaction.Inputs.Count); // 9
```

Dengan ID transaksi outpoint sebelumnya, kita bisa melihat informasi yang berkaitan dengan transaksi tersebut.

```csharp
OutPoint firstPreviousOutPoint = transaction.Inputs.First().PrevOut;
var firstPreviousTransaction = client.GetTransaction(firstPreviousOutPoint.Hash).Result.Transaction;
Console.WriteLine(firstPreviousTransaction.IsCoinBase); // False
```

Kita bisa untuk terus melanjutkan melacak ID transaksi hingga kembali sampai kepada transaksi coinbase, transaksi koin baru yang ditambang oleh penambang.\
**Latihan:** Ikuti input pertama pada transaksi ini sampai anda mencapai transaksi coinbase!\
Petunjuk: Setelah mencoba mengikuti hingga 30-40 transaksi, saya menyerah.\
Ya, tebakan anda benar, hal itu bukanlah cara yang efektif untuk melakukannya, namun menjadi sebuah latihan yang baik.

Pada contoh kami, jumlah output adalah 13.19**70**3492 BTC.

```csharp
Money spentAmount = Money.Zero;
foreach (var spentCoin in spentCoins)
{
    spentAmount = (Money)spentCoin.Amount.Add(spentAmount);
}
Console.WriteLine(spentAmount.ToDecimal(MoneyUnit.BTC)); // 13.19703492
```

Pada transaksi tersebut, sejumlah 13.19**68**3492 BTC telah diterima.

**Latihan:** Dapatkan jumlah total yang diterima, seperti yang telah saya lakukan dengan sejumlah pengeluaran.

Artinya, sejumlah 0.0002 BTC (atau 13.19**70**3492 - 13.19**68**3492) tidak dihitung! Perbedaan antara input dan output disebut dengan **Transaction Fees** (biaya transaksi) atau **Miner’s Fees** (biaya miner). Biaya ini adalah sejumlah ongkos yang diberikan kepada penambang untuk memproses transaksi itu, hingga memasukkannya ke dalam sebuah block.

```csharp
var fee = transaction.GetFee(spentCoins.ToArray());
Console.WriteLine(fee);
```

Perlu dicatat disini, **transaksi coinbase** adalah satu-satunya transaksi yang nilai outpunya lebih superior dibandingkan dengan nilai input. Karena transaksi itu adalah transaksi penciptaan koin baru. Artinya, tidak ada biaya pada transaksi coinbase tersebut. Transaksi coinbase ini, adalah transaksi pertama yang ada dalam setiap block.\
Dikatakan nilai output lebih istimewa dari nilai input, karena berdasarkan aturan konsensus yang ada, jumlah nilai output dalam transaksi coinbase tidak melebihi jumlah total biaya transaksi, ditambah dengan reward block.
