public Converter(DataType boxedJavaObject, IEssentials essentials, IILFactory ilFactory, ForeignHelpers helpers) { Essentials = essentials; Type = new TypeConverter(this, boxedJavaObject, essentials, helpers); Name = new NameConverter(this, ilFactory); Param = new ParamConverter(this); Signature = new SignatureConverter(this, essentials); }
public void RawSignatureToTransactionSignatureTest() { byte[] rawSignature = "310e45454b0978a623f36a10626ef17b27d9ad44e2760f98cfa3efb37924f0220220bd8acd43ecaa916a80bd4f919c495a2c58982ce7c8625112456464456452".HexToByteArray(); var result = SignatureConverter.RawToTransactionSignature(rawSignature); var data = result.ToRawSignature(); Assert.Equal(rawSignature.ToHex(), data.ToHex()); }
private void OnClosingSigned(IPeer peer, ClosingSignedMessage message) { var channel = _channelService.Channels.SingleOrDefault(c => c.ChannelId == message.ChannelId.ToHex()); if (channel == null) { _logger.LogDebug($"Remote sent us a {nameof(ClosingSignedMessage)}, but there is no matching channel."); peer.Messaging.Send(ErrorMessage.UnknownChannel(message.ChannelId)); return; } // TODO: verify signature var signedCloseTx = BuildSignedCloseTransaction(channel, SignatureConverter.RawToTransactionSignature(message.Signature), message.FeeSatoshi); if (channel.IsFunder) { bool isFairFee = IsFairFee(signedCloseTx, message.FeeSatoshi); if (isFairFee) { _channelLoggingService.LogInfo(channel, "Mutual Close Transaction", signedCloseTx.ToString()); _blockchainClientService.SendTransaction(signedCloseTx); } else if (_failedFeeNegotiations.Contains(channel)) { _logger.LogWarning("Unable to negotiate a fair fee for our closing transaction. Will do a unilateral close."); UnilateralClose(channel); } else { _failedFeeNegotiations.Add(channel); RespondWithClosingSigned(peer, channel); } } else { RespondWithClosingSigned(peer, channel, message.FeeSatoshi); } _channelService.UpdateChannel(channel); }
public void Handle(IPeer peer, FundingSignedMessage message, PendingChannel pendingChannel) { var channel = pendingChannel.Channel; var oldState = channel.State; var signature = SignatureConverter.RawToTransactionSignature(message.Signature); if (!_commitmentService.IsValidRemoteCommitmentSignature(channel, signature)) { _channelLoggingService.LogError(channel, LocalChannelError.InvalidCommitmentSignature, $"Remote {peer.NodeAddress} sent us an invalid commitment signature"); string error = "Invalid commitment transaction signature."; channel.State = LocalChannelState.FundingFailed; peer.Messaging.Send(new ErrorMessage(message.ChannelId, error)); throw new ChannelException(error, channel); } channel.LocalCommitmentTxParameters.RemoteSignature = signature; channel.State = LocalChannelState.FundingSigned; _channelService.AddChannel(peer, channel); _fundingService.BroadcastFundingTransaction(channel); _blockchainMonitorService.WatchForTransactionId(channel.FundingTransactionId, (ushort)channel.MinimumDepth); _channelService.RemovePendingChannel(pendingChannel); _channelLoggingService.LogStateUpdate(channel, oldState); }
public void ValidateTest() { CommitmentTransactionBuilder builder = new CommitmentTransactionBuilder(); /* * OpenChannelMessage(32) * Chain Hash (Hash (32 Bytes), 32): 43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000 * Temporary Channel ID (Channel ID, 32): 9b33024da3d0f725434cbaa91dfbdcd18d8e372d879d2a0c94d5e23836786715 * Funding Satoshis (Unsigned Long, 8): 25000 (0x00000000000061a8) * Push mSat (Unsigned Long, 8): 0 (0x0000000000000000) * Dust Limit Satoshis (Unsigned Long, 8): 546 (0x0000000000000222) * Max HTLC Value In Flight mSat (Unsigned Long, 8): 5000000000 (0x000000012a05f200) * Channel Reserve Satoshis (Unsigned Long, 8): 2500 (0x00000000000009c4) * HTLC Minimum mSat (Unsigned Long, 8): 1000 (0x00000000000003e8) * Feerate Per KW (Unsigned Integer, 4): 1011 (0x000003f3) * To Self Delay (Unsigned Short, 2): 144 (0x0090) * Max Accepted HTLCs (Unsigned Short, 2): 483 (0x01e3) * Funding PubKey (Public Key, 33): 0250d049da6b5832a9f2416df3b0db52da127426c2b70a35ca9c270a72f3f840b5 * Revocation Basepoint (Public Key, 33): 022ecc432552ff86d053514ffb133d3025fb14c39aa5ae2a5169b0367174cabfa4 * Payment Basepoint (Public Key, 33): 029d100efe40aa3f58985fa12bd0f5c75711449ff4d30adca6f1968a2200bbbf1a * Delayed Payment Basepoint (Public Key, 33): 0245b02f6672c2342fe3ced57118fcf4a0309327e32c335ce494365eb0d15b7200 * HTLC Basepoint (Public Key, 33): 03d029229db8f594adcd545b4a42acbb1013286908d2905fa05c9a4e2083fe3fe2 * First Per Commitment Point (Public Key, 33): 02846726efa57378ad8370acf094f26902a7f1e21903791ef4ab6f989da86679f2 * Channel Flags (Byte, 1): 00 * Shutdown ScriptPubKey (Variable Array, 25): 76a9141c60596620b0b9966400cb710b8da6de5a80d68588ac * * AcceptChannelMessage(33) * Temporary Channel ID (Channel ID, 32): 9b33024da3d0f725434cbaa91dfbdcd18d8e372d879d2a0c94d5e23836786715 * Dust Limit Satoshis (Unsigned Long, 8): 573 (0x000000000000023d) * Max HTLC Value In Flight mSat (Unsigned Long, 8): 24750000 (0x000000000179a7b0) * Channel Reserve Satoshis (Unsigned Long, 8): 546 (0x0000000000000222) * HTLC Minimum mSat (Unsigned Long, 8): 1000 (0x00000000000003e8) * Minimum Depth (Unsigned Integer, 4): 3 (0x00000003) * To Self Delay (Unsigned Short, 2): 144 (0x0090) * Max Accepted HTLCs (Unsigned Short, 2): 483 (0x01e3) * Funding PubKey (Public Key, 33): 0299de4bbf495e5bbeb2456c2beb3f40450a3fa41aaa50819ae201f8ad69226bfe * Revocation Basepoint (Public Key, 33): 022b2aa486f5a8aca1898824ac3b2a8a15c92de813362846b992f94d923b143f92 * Payment Basepoint (Public Key, 33): 02d91224d91760f477df21d24713b713c681b084e508f48dc77ca14db549ba8ceb * Delayed Payment Basepoint (Public Key, 33): 0341665cedb568e09f0ab2ab4a28bc2749620deacefb3dce61aac8251c91709d3a * HTLC Basepoint (Public Key, 33): 0336439e36e2bc1f264c6d3bc6e12db6256389bef2056c32e6267d6e285c2b2122 * First Per Commitment Point (Public Key, 33): 039360132ab07e7f56d6782a644233da9c4c24845609fcd302cbedd69f69848358 * * FundingCreatedMessage(34) * Temporary Channel ID (Channel ID, 32): 9b33024da3d0f725434cbaa91dfbdcd18d8e372d879d2a0c94d5e23836786715 * Funding Transaction ID (Transaction ID, 32): 282ea2263611611169ee505fc83979ecaf1ad99b565f9d64c1b1fb804c427da3 * Funding Output Index (Unsigned Short, 2): 1 (0x0001) * Signature (Signature, 64): 4fed2d370e0166934d63d4b0ca5c523839ca12bc2acdc5c3238c33a1460e409d39a5d267d7132abe3b8c6bf46c2bf456a47b4462931558af371dfd1f7312f0a5 * * FundingSignedMessage(35) * Channel ID (Channel ID, 32): 282ea2263611611169ee505fc83979ecaf1ad99b565f9d64c1b1fb804c427da2 * Signature (Signature, 64): 2f26e967305b4d422116a7c876d338bc4298263f329a54c0d1655f55d594de4955356386addd0bc15ced36dacece0af439694195654c838769583409eeac5d3f * */ // Local ECKeyPair fundingKeyPrivateKey = new ECKeyPair("DD06232AE9A50384A72D85CED6351DCB35C798231D4985615C77D6847F83FC65", true); ECKeyPair localFundingPubKey = new ECKeyPair("0250d049da6b5832a9f2416df3b0db52da127426c2b70a35ca9c270a72f3f840b5", false); ECKeyPair localPaymentBasepoint = new ECKeyPair("029d100efe40aa3f58985fa12bd0f5c75711449ff4d30adca6f1968a2200bbbf1a", false); ECKeyPair localDelayedPaymentBasepoint = new ECKeyPair("0245b02f6672c2342fe3ced57118fcf4a0309327e32c335ce494365eb0d15b7200", false); ECKeyPair localPerCommitmentPoint = new ECKeyPair("02846726efa57378ad8370acf094f26902a7f1e21903791ef4ab6f989da86679f2", false); // Remote ECKeyPair remoteRevocationBasepoint = new ECKeyPair("022b2aa486f5a8aca1898824ac3b2a8a15c92de813362846b992f94d923b143f92", false); ECKeyPair remotePaymentBasepoint = new ECKeyPair("02d91224d91760f477df21d24713b713c681b084e508f48dc77ca14db549ba8ceb", false); ECKeyPair remoteFundingKey = new ECKeyPair("0299de4bbf495e5bbeb2456c2beb3f40450a3fa41aaa50819ae201f8ad69226bfe", false); // Derive Local RevocationPublicKeyDerivation revocationPublicKeyDerivation = new RevocationPublicKeyDerivation(localPerCommitmentPoint); PublicKeyDerivation publicKeyDerivation = new PublicKeyDerivation(localPerCommitmentPoint); ECKeyPair localDelayedPaymentPubkey = publicKeyDerivation.Derive(localDelayedPaymentBasepoint); ECKeyPair localRevocationPubkey = revocationPublicKeyDerivation.DerivePublicKey(remoteRevocationBasepoint); builder.CommitmentTxParams = new CommitmentTransactionParameters(); builder.CommitmentTxParams.TransactionNumber = 0; builder.CommitmentTxParams.RevocationPublicKey = localRevocationPubkey; builder.CommitmentTxParams.DelayedPaymentPublicKey = localDelayedPaymentPubkey; builder.CommitmentTxParams.PaymentBasepoint = localPaymentBasepoint; builder.CommitmentTxParams.FundingKey = localFundingPubKey; builder.FeeratePerKw = 1011; builder.CommitmentTxParams.ToLocalMsat = 25000000; builder.CommitmentTxParams.ToRemoteMsat = 0; builder.FundingTransactionOutputIndex = 1; builder.FundingAmount = 25000; builder.FundingTransactionHash = "a37d424c80fbb1c1649d5f569bd91aafec7939c85f50ee691161113626a22e28"; builder.IsFunder = true; builder.ChannelParameters = new ChannelParameters(); builder.ChannelParameters.DustLimitSatoshis = 546; builder.ChannelParameters.ToSelfDelay = 144; builder.RemotePaymentBasePoint = remotePaymentBasepoint; builder.RemoteFundingPubKey = remoteFundingKey; builder.Network = NBitcoin.Network.TestNet; var signature = SignatureConverter.RawToTransactionSignature("2f26e967305b4d422116a7c876d338bc4298263f329a54c0d1655f55d594de4955356386addd0bc15ced36dacece0af439694195654c838769583409eeac5d3f" .HexToByteArray()); Assert.True(builder.IsValidSignature(signature, fundingKeyPrivateKey)); }