Pengkodean Multi-Sig cukup mudah, dan dapat bekerja. Namun sebelum p2sh, belum ada cara yang bisa dilakukan untuk meminta kepada customer agar membayarnya menggunakanscriptPubKey multi-sig dengan mudah, semudah menggunakanBitcoinAddress.
P2SH, atau Pay To Script Hash, adalah cara termudah untuk merepresentasikanscriptPubKey semudah menggunakanBitcoinScriptAddress, meskipun untuk mewujudkannya juga cukup kompleks dan rumit.
Pada pembahasan sebelumnya, kita menggunakan berikut ini untuk generate multisig:
Apa sudah bisa membedakan? P2shscriptPubKeymerepresentasikan hash dari script multi-sig: redeemScript.Hash.ScriptPubKey
Karena itu adalah hash, maka anda juga dapat merubahnya menjadi string base58 dengan mudah, sepertiBitcoinScriptAddress.
Beberapa address dapat terbaca dengan baik di berbagai klien wallet. Meskipun pada beberapa wallet tidak begitu mengenal “multi sig”.
Pada transaksi pembayaran P2SH, kita merujuk sebagai Redeem Script, dimana yang akan di hash adalahscriptPubKey.
Karena "payer" hanya mengetahui tentang Hash dari RedeemScript, dia tidak mengetahui Redeem Script, oleh karena itu, dalam hal ini, kita juga tidak mengetahui apakah ia mengirimkan uangnya menggunakan multi sig dari transaksi antara Bob\/Satoshi\/Alice.
Dalam hal penandatanganan transaksi, mirip dengan yang telah kita lakukan sebelumnya. Hanya saja perbedaannya adalah, anda terlebih dahulu harus menentukan Redeem Script ketika anda membangun koin itu pada TransactionBuilder
Mari kita bayangkan kembali bahwa multi sig P2SH menerima koin dalam sebuah transaksi, atau yang disebut denganreceived.
Warning: Pembayaran ini dikirimkan kepada redeemScript.Hash bukan kepada redeemScript!
Lalu, jika alice\/bob\/satoshi ingin dapat membelanjakan koin yang telah diterimanya, mereka bisa membuatScriptCoin.
Sisa kode selanjutnya untuk generate transaksi dan juga penandatangan transaksi, sama persis pada pembahasan sebelumnya tentang multi sig.
Key bob = new Key();
Key alice = new Key();
Key satoshi = new Key();
Script redeemScript =
PayToMultiSigTemplate
.Instance
.GenerateScriptPubKey(2, new[] { bob.PubKey, alice.PubKey, satoshi.PubKey });
//Console.WriteLine(redeemScript.Hash.ScriptPubKey);
Console.WriteLine(redeemScript.Hash.GetAddress(Network.Main)); // 3E6RvwLNfkH6PyX3bqoVGKzrx2AqSJFhjo
Script redeemScript =
PayToMultiSigTemplate
.Instance
.GenerateScriptPubKey(2, new[] { bob.PubKey, alice.PubKey, satoshi.PubKey });
////Console.WriteLine(redeemScript.Hash.ScriptPubKey);
//Console.WriteLine(redeemScript.Hash.GetAddress(Network.Main));
Transaction received = new Transaction();
//Pay to the script hash
received.Outputs.Add(new TxOut(Money.Coins(1.0m), redeemScript.Hash));
//Give the redeemScript to the coin for Transaction construction
//and signing
ScriptCoin coin = received.Outputs.AsCoins().First()
.ToScriptCoin(redeemScript);