public void CanCompressScript() { var payToHashTemplate = new PayToPubkeyHashTemplate(); var payToScriptTemplate = new PayToScriptHashTemplate(); var payToPubKeyTemplate = new PayToPubkeyTemplate(); var key = new Key(true); //Pay to pubkey hash (encoded as 21 bytes) var script = payToHashTemplate.GenerateScriptPubKey(key.PubKey.ID); AssertCompressed(script, 21); script = payToHashTemplate.GenerateScriptPubKey(key.PubKey.Decompress().ID); AssertCompressed(script, 21); //Pay to script hash (encoded as 21 bytes) script = payToScriptTemplate.GenerateScriptPubKey(script); AssertCompressed(script, 21); //Pay to pubkey starting with 0x02, 0x03 or 0x04 (encoded as 33 bytes) script = payToPubKeyTemplate.GenerateScriptPubKey(key.PubKey); script = AssertCompressed(script, 33); var readenKey = payToPubKeyTemplate.ExtractScriptPubKeyParameters(script); AssertEx.CollectionEquals(readenKey.ToBytes(), key.PubKey.ToBytes()); script = payToPubKeyTemplate.GenerateScriptPubKey(key.PubKey.Decompress()); script = AssertCompressed(script, 33); readenKey = payToPubKeyTemplate.ExtractScriptPubKeyParameters(script); AssertEx.CollectionEquals(readenKey.ToBytes(), key.PubKey.Decompress().ToBytes()); //Other scripts up to 121 bytes require 1 byte + script length. script = new Script(Enumerable.Range(0, 60).Select(_ => (Op)OpcodeType.OP_RETURN).ToArray()); AssertCompressed(script, 61); script = new Script(Enumerable.Range(0, 120).Select(_ => (Op)OpcodeType.OP_RETURN).ToArray()); AssertCompressed(script, 121); //Above that, scripts up to 16505 bytes require 2 bytes + script length. script = new Script(Enumerable.Range(0, 122).Select(_ => (Op)OpcodeType.OP_RETURN).ToArray()); AssertCompressed(script, 124); }