Skip to content

Commit 78dc243

Browse files
committed
Add JsonMarshalling module
This commit adds the JsonMarshalling module which defines json serialization converters for a bunch of types exported by DotNetLightning. This allows the consumer of DotNetLightning to serialize the channel state to a wallet file.
1 parent 6dbc8d2 commit 78dc243

File tree

2 files changed

+254
-0
lines changed

2 files changed

+254
-0
lines changed

src/DotNetLightning.Core/DotNetLightning.Core.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
<Compile Include="Routing\RouterState.fs" />
9696
<Compile Include="Routing\RouterTypes.fs" />
9797
<Compile Include="Routing\Router.fs" />
98+
<Compile Include="JsonMarshalling.fs" />
9899
</ItemGroup>
99100
<ItemGroup>
100101
<PackageReference Update="FSharp.Core" Version="4.7.0" />
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
namespace DotNetLightning
2+
3+
open System
4+
open System.Net
5+
6+
open DotNetLightning.Serialize
7+
open DotNetLightning.Utils
8+
open DotNetLightning.Crypto
9+
open DotNetLightning.Transactions
10+
11+
open NBitcoin
12+
open NBitcoin.Crypto
13+
open Newtonsoft.Json
14+
15+
module JsonMarshalling =
16+
type internal FinalizedTxConverter() =
17+
inherit JsonConverter<FinalizedTx>()
18+
19+
override this.ReadJson(reader: JsonReader, _: Type, _: FinalizedTx, _: bool, serializer: JsonSerializer) =
20+
let tx = serializer.Deserialize<Transaction> reader
21+
FinalizedTx tx
22+
23+
override this.WriteJson(writer: JsonWriter, state: FinalizedTx, serializer: JsonSerializer) =
24+
serializer.Serialize(writer, state.Value)
25+
26+
type internal LNECDSASignatureConverter() =
27+
inherit JsonConverter<LNECDSASignature>()
28+
29+
override this.ReadJson(reader: JsonReader, _: Type, _: LNECDSASignature, _: bool, serializer: JsonSerializer) =
30+
let serializedLNECDSASignature = serializer.Deserialize<string> reader
31+
let hex = NBitcoin.DataEncoders.HexEncoder()
32+
serializedLNECDSASignature |> hex.DecodeData |> ECDSASignature |> LNECDSASignature
33+
34+
override this.WriteJson(writer: JsonWriter, state: LNECDSASignature, serializer: JsonSerializer) =
35+
let hex = NBitcoin.DataEncoders.HexEncoder()
36+
let serializedLNECDSASignature: string = state.ToDER() |> hex.EncodeData
37+
serializer.Serialize(writer, serializedLNECDSASignature)
38+
39+
type internal TxIdConverter() =
40+
inherit JsonConverter<TxId>()
41+
42+
override this.ReadJson(reader: JsonReader, _: Type, _: TxId, _: bool, serializer: JsonSerializer) =
43+
let serializedTxId = serializer.Deserialize<string> reader
44+
let hex = NBitcoin.DataEncoders.HexEncoder()
45+
serializedTxId |> hex.DecodeData |> uint256 |> TxId
46+
47+
override this.WriteJson(writer: JsonWriter, state: TxId, serializer: JsonSerializer) =
48+
let hex = NBitcoin.DataEncoders.HexEncoder()
49+
let serializedTxId: string = state.Value.ToBytes() |> hex.EncodeData
50+
serializer.Serialize(writer, serializedTxId)
51+
52+
type internal ChannelIdConverter() =
53+
inherit JsonConverter<ChannelId>()
54+
55+
override this.ReadJson(reader: JsonReader, _: Type, _: ChannelId, _: bool, serializer: JsonSerializer) =
56+
let serializedChannelId = serializer.Deserialize<string> reader
57+
let hex = NBitcoin.DataEncoders.HexEncoder()
58+
serializedChannelId |> hex.DecodeData |> uint256 |> ChannelId
59+
60+
override this.WriteJson(writer: JsonWriter, state: ChannelId, serializer: JsonSerializer) =
61+
let hex = NBitcoin.DataEncoders.HexEncoder()
62+
let serializedChannelId: string = state.Value.ToBytes() |> hex.EncodeData
63+
serializer.Serialize(writer, serializedChannelId)
64+
65+
type internal NodeIdConverter() =
66+
inherit JsonConverter<NodeId>()
67+
68+
override this.ReadJson(reader: JsonReader, _: Type, _: NodeId, _: bool, serializer: JsonSerializer) =
69+
let serializedNodeId = serializer.Deserialize<string> reader
70+
let hex = NBitcoin.DataEncoders.HexEncoder()
71+
serializedNodeId |> hex.DecodeData |> PubKey |> NodeId
72+
73+
override this.WriteJson(writer: JsonWriter, state: NodeId, serializer: JsonSerializer) =
74+
let serializedNodeId: string = state.Value.ToHex()
75+
serializer.Serialize(writer, serializedNodeId)
76+
77+
type internal CommitmentPubKeyConverter() =
78+
inherit JsonConverter<CommitmentPubKey>()
79+
80+
override this.ReadJson(reader: JsonReader, _: Type, _: CommitmentPubKey, _: bool, serializer: JsonSerializer) =
81+
let serializedCommitmentPubKey = serializer.Deserialize<string> reader
82+
let hex = NBitcoin.DataEncoders.HexEncoder()
83+
serializedCommitmentPubKey |> hex.DecodeData |> PubKey |> CommitmentPubKey
84+
85+
override this.WriteJson(writer: JsonWriter, state: CommitmentPubKey, serializer: JsonSerializer) =
86+
let serializedCommitmentPubKey: string = state.PubKey.ToHex()
87+
serializer.Serialize(writer, serializedCommitmentPubKey)
88+
89+
type internal CommitmentNumberConverter() =
90+
inherit JsonConverter<CommitmentNumber>()
91+
92+
override this.ReadJson(reader: JsonReader, _: Type, _: CommitmentNumber, _: bool, serializer: JsonSerializer) =
93+
let serializedCommitmentNumber = serializer.Deserialize<uint64> reader
94+
CommitmentNumber <| (UInt48.MaxValue - UInt48.FromUInt64 serializedCommitmentNumber)
95+
96+
override this.WriteJson(writer: JsonWriter, state: CommitmentNumber, serializer: JsonSerializer) =
97+
let serializedCommitmentNumber: uint64 = (UInt48.MaxValue - state.Index).UInt64
98+
serializer.Serialize(writer, serializedCommitmentNumber)
99+
100+
type internal RevocationSetConverter() =
101+
inherit JsonConverter<RevocationSet>()
102+
103+
override this.ReadJson(reader: JsonReader, _: Type, _: RevocationSet, _: bool, serializer: JsonSerializer) =
104+
let keys = serializer.Deserialize<list<CommitmentNumber * RevocationKey>> reader
105+
RevocationSet.FromKeys keys
106+
107+
override this.WriteJson(writer: JsonWriter, state: RevocationSet, serializer: JsonSerializer) =
108+
let keys: list<CommitmentNumber * RevocationKey> = state.Keys
109+
serializer.Serialize(writer, keys)
110+
111+
type internal FeatureBitJsonConverter() =
112+
inherit JsonConverter<FeatureBit>()
113+
114+
override self.ReadJson(reader: JsonReader, _: Type, _: FeatureBit, _: bool, serializer: JsonSerializer) =
115+
let serializedFeatureBit = serializer.Deserialize<string> reader
116+
match (FeatureBit.TryParse serializedFeatureBit) with
117+
| Ok featureBit -> featureBit
118+
| Error err -> failwith ("error decoding feature bit: " + err)
119+
120+
override self.WriteJson(writer: JsonWriter, state: FeatureBit, serializer: JsonSerializer) =
121+
serializer.Serialize(writer, state.ToString())
122+
123+
type internal IPAddressJsonConverter() =
124+
inherit JsonConverter<IPAddress>()
125+
126+
override self.ReadJson(reader: JsonReader, _: Type, _: IPAddress, _: bool, serializer: JsonSerializer) =
127+
let serializedIPAddress = serializer.Deserialize<string> reader
128+
IPAddress.Parse serializedIPAddress
129+
130+
override self.WriteJson(writer: JsonWriter, state: IPAddress, serializer: JsonSerializer) =
131+
serializer.Serialize(writer, state.ToString())
132+
133+
type internal IPEndPointJsonConverter() =
134+
inherit JsonConverter<IPEndPoint>()
135+
136+
override __.ReadJson(reader: JsonReader, _: Type, _: IPEndPoint, _: bool, serializer: JsonSerializer) =
137+
assert (reader.TokenType = JsonToken.StartArray)
138+
reader.Read() |> ignore
139+
let ip = serializer.Deserialize<IPAddress> reader
140+
reader.Read() |> ignore
141+
let port = serializer.Deserialize<int32> reader
142+
assert (reader.TokenType = JsonToken.EndArray)
143+
reader.Read() |> ignore
144+
IPEndPoint (ip, port)
145+
146+
override __.WriteJson(writer: JsonWriter, state: IPEndPoint, serializer: JsonSerializer) =
147+
writer.WriteStartArray()
148+
serializer.Serialize(writer, state.Address)
149+
serializer.Serialize(writer, state.Port)
150+
writer.WriteEndArray()
151+
152+
type internal BlockHeightConverter() =
153+
inherit JsonConverter<BlockHeight>()
154+
155+
override this.ReadJson(reader: JsonReader, _: Type, _: BlockHeight, _: bool, serializer: JsonSerializer) =
156+
let serializedBlockHeight = serializer.Deserialize<uint32> reader
157+
BlockHeight serializedBlockHeight
158+
159+
override this.WriteJson(writer: JsonWriter, state: BlockHeight, serializer: JsonSerializer) =
160+
serializer.Serialize(writer, state.Value)
161+
162+
type internal BlockHeightOffset16Converter() =
163+
inherit JsonConverter<BlockHeightOffset16>()
164+
165+
override this.ReadJson(reader: JsonReader, _: Type, _: BlockHeightOffset16, _: bool, serializer: JsonSerializer) =
166+
let serializedBlockHeightOffset16 = serializer.Deserialize<uint16> reader
167+
BlockHeightOffset16 serializedBlockHeightOffset16
168+
169+
override this.WriteJson(writer: JsonWriter, state: BlockHeightOffset16, serializer: JsonSerializer) =
170+
serializer.Serialize(writer, state.Value)
171+
172+
type internal BlockHeightOffset32Converter() =
173+
inherit JsonConverter<BlockHeightOffset32>()
174+
175+
override this.ReadJson(reader: JsonReader, _: Type, _: BlockHeightOffset32, _: bool, serializer: JsonSerializer) =
176+
let serializedBlockHeightOffset32 = serializer.Deserialize<uint32> reader
177+
BlockHeightOffset32 serializedBlockHeightOffset32
178+
179+
override this.WriteJson(writer: JsonWriter, state: BlockHeightOffset32, serializer: JsonSerializer) =
180+
serializer.Serialize(writer, state.Value)
181+
182+
type internal FeeRatePerKwConverter() =
183+
inherit JsonConverter<FeeRatePerKw>()
184+
185+
override this.ReadJson(reader: JsonReader, _: Type, _: FeeRatePerKw, _: bool, serializer: JsonSerializer) =
186+
let serializedFeeRatePerKw = serializer.Deserialize<uint32> reader
187+
FeeRatePerKw serializedFeeRatePerKw
188+
189+
override this.WriteJson(writer: JsonWriter, state: FeeRatePerKw, serializer: JsonSerializer) =
190+
serializer.Serialize(writer, state.Value)
191+
192+
type internal LNMoneyConverter() =
193+
inherit JsonConverter<LNMoney>()
194+
195+
override this.ReadJson(reader: JsonReader, _: Type, _: LNMoney, _: bool, serializer: JsonSerializer) =
196+
let serializedLNMoney = serializer.Deserialize<decimal> reader
197+
LNMoney.Coins serializedLNMoney
198+
199+
override this.WriteJson(writer: JsonWriter, state: LNMoney, serializer: JsonSerializer) =
200+
serializer.Serialize(writer, (decimal state.MilliSatoshi) / (decimal LNMoneyUnit.BTC))
201+
202+
type internal HTLCIdConverter() =
203+
inherit JsonConverter<HTLCId>()
204+
205+
override this.ReadJson(reader: JsonReader, _: Type, _: HTLCId, _: bool, serializer: JsonSerializer) =
206+
let serializedHTLCId = serializer.Deserialize<uint64> reader
207+
HTLCId serializedHTLCId
208+
209+
override this.WriteJson(writer: JsonWriter, state: HTLCId, serializer: JsonSerializer) =
210+
serializer.Serialize(writer, state.Value)
211+
212+
type internal TxIndexInBlockConverter() =
213+
inherit JsonConverter<TxIndexInBlock>()
214+
215+
override this.ReadJson(reader: JsonReader, _: Type, _: TxIndexInBlock, _: bool, serializer: JsonSerializer) =
216+
let serializedTxIndexInBlock = serializer.Deserialize<uint32> reader
217+
TxIndexInBlock serializedTxIndexInBlock
218+
219+
override this.WriteJson(writer: JsonWriter, state: TxIndexInBlock, serializer: JsonSerializer) =
220+
serializer.Serialize(writer, state.Value)
221+
222+
type internal TxOutIndexConverter() =
223+
inherit JsonConverter<TxOutIndex>()
224+
225+
override this.ReadJson(reader: JsonReader, _: Type, _: TxOutIndex, _: bool, serializer: JsonSerializer) =
226+
let serializedTxOutIndex = serializer.Deserialize<uint16> reader
227+
TxOutIndex serializedTxOutIndex
228+
229+
override this.WriteJson(writer: JsonWriter, state: TxOutIndex, serializer: JsonSerializer) =
230+
serializer.Serialize(writer, state.Value)
231+
232+
let RegisterConverters (settings: JsonSerializerSettings) =
233+
settings.Converters.Add <| IPAddressJsonConverter()
234+
settings.Converters.Add <| IPEndPointJsonConverter()
235+
settings.Converters.Add <| FeatureBitJsonConverter()
236+
settings.Converters.Add <| CommitmentNumberConverter()
237+
settings.Converters.Add <| CommitmentPubKeyConverter()
238+
settings.Converters.Add <| RevocationSetConverter()
239+
settings.Converters.Add <| BlockHeightConverter()
240+
settings.Converters.Add <| BlockHeightOffset16Converter()
241+
settings.Converters.Add <| BlockHeightOffset32Converter()
242+
settings.Converters.Add <| FeeRatePerKwConverter()
243+
settings.Converters.Add <| LNMoneyConverter()
244+
settings.Converters.Add <| HTLCIdConverter()
245+
settings.Converters.Add <| NodeIdConverter()
246+
settings.Converters.Add <| TxIdConverter()
247+
settings.Converters.Add <| ChannelIdConverter()
248+
settings.Converters.Add <| TxIndexInBlockConverter()
249+
settings.Converters.Add <| TxOutIndexConverter()
250+
settings.Converters.Add <| LNECDSASignatureConverter()
251+
settings.Converters.Add <| FinalizedTxConverter()
252+
NBitcoin.JsonConverters.Serializer.RegisterFrontConverters settings
253+

0 commit comments

Comments
 (0)