1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-13 11:35:47 +01:00

provide cleaner json serializer for ShaChain objects

This commit is contained in:
sstone 2018-05-29 16:17:11 +02:00
parent 86c1c8dc8f
commit f6c35211d0
No known key found for this signature in database
GPG key ID: 7A73FE77DE2C4027
3 changed files with 29 additions and 15 deletions

View file

@ -145,7 +145,7 @@
<dependency>
<groupId>com.lihaoyi</groupId>
<artifactId>upickle_2.11</artifactId>
<version>0.6.5</version>
<version>0.6.6</version>
</dependency>
<!-- BITCOIN -->
<dependency>

View file

@ -24,15 +24,7 @@ object JsonSerializers {
implicit val uint64ReadWriter: ReadWriter[UInt64] = readwriter[String].bimap[UInt64](_.toString, s => UInt64(s.toLong))
implicit val localParamsReadWriter: ReadWriter[LocalParams] = macroRW
implicit val remoteParamsReadWriter: ReadWriter[RemoteParams] = macroRW
implicit val directionReadWriter: ReadWriter[Direction] = readwriter[String].bimap[Direction](f => f match {
case IN =>
"IN"
case OUT =>
"OUT"
}, _ match {
case "IN" => IN
case "OUT" => OUT
})
implicit val directionReadWriter: ReadWriter[Direction] = macroRW
implicit val updateAddHtlcReadWriter: ReadWriter[UpdateAddHtlc] = macroRW
implicit val updateFailHtlcReadWriter: ReadWriter[UpdateFailHtlc] = macroRW
implicit val updateMessageReadWriter: ReadWriter[UpdateMessage] = ReadWriter.merge(macroRW[UpdateAddHtlc], macroRW[UpdateFailHtlc])
@ -54,7 +46,16 @@ object JsonSerializers {
implicit val waitingForRevocationReadWriter: ReadWriter[WaitingForRevocation] = macroRW
implicit val paymentOriginReadWriter: ReadWriter[Origin] = readwriter[String].bimap[Origin](_.toString, _ => fr.acinq.eclair.payment.Local(None))
implicit val remoteChangesReadWriter: ReadWriter[RemoteChanges] = macroRW
implicit val shaChainReadWriter: ReadWriter[ShaChain] = macroRW
case class ShaChain2(knownHashes: Map[Long, BinaryData], lastIndex: Option[Long] = None) {
def toShaChain = ShaChain(knownHashes.map { case (k, v) => ShaChain.moves(k) -> v }, lastIndex)
}
object ShaChain2 {
def toLong(input: Vector[Boolean]) : Long = input.foldLeft(0) { case (acc, flag) => if (flag) 2 * acc + 1 else 2 * acc }
def apply(shaChain: ShaChain): ShaChain2 = new ShaChain2(shaChain.knownHashes.map { case (k,v) => toLong(k) -> v }, shaChain.lastIndex)
}
implicit val shaChain2ReadWriter: ReadWriter[ShaChain2] = macroRW
implicit val shaChainReadWriter: ReadWriter[ShaChain] = readwriter[ShaChain2].bimap[ShaChain](s => ShaChain2(s), s2 => s2.toShaChain)
implicit val commitmentsReadWriter: ReadWriter[Commitments] = macroRW
implicit val actorRefReadWriter: ReadWriter[ActorRef] = readwriter[String].bimap[ActorRef](_.toString, _ => ActorRef.noSender)
implicit val shortChannelIdReadWriter: ReadWriter[ShortChannelId] = readwriter[String].bimap[ShortChannelId](_.toString, s => ShortChannelId(s))

View file

@ -2,16 +2,20 @@ package fr.acinq.eclair
import java.net.{InetAddress, InetSocketAddress}
import fr.acinq.bitcoin.{BinaryData, DeterministicWallet, OutPoint}
import fr.acinq.bitcoin.{BinaryData, DeterministicWallet, Hash, OutPoint}
import fr.acinq.eclair.channel.{LocalChanges, LocalParams, RemoteParams}
import fr.acinq.eclair.crypto.ShaChain
import fr.acinq.eclair.db.ChannelStateSpec
import fr.acinq.eclair.transactions._
import fr.acinq.eclair.wire.{NodeAddress, UpdateAddHtlc, UpdateFailHtlc}
import org.junit.runner.RunWith
import org.scalatest.FunSuite
import org.scalatest.junit.JUnitRunner
import upickle.default.write
import scala.util.Random
@RunWith(classOf[JUnitRunner])
class JsonSerializersSpec extends FunSuite {
import JsonSerializers._
@ -25,7 +29,7 @@ class JsonSerializersSpec extends FunSuite {
output2 -> BinaryData("beef")
)
val json = write(map)
assert(json === s"""{"${output1.txid}:0":"dead","${output2.txid}:1":"beef"}""")
assert(json === s"""[["${output1.hash}:0","dead"],["${output2.hash}:1","beef"]]""")
}
test("NodeAddress serialization") {
@ -37,8 +41,8 @@ class JsonSerializersSpec extends FunSuite {
}
test("Direction serialization") {
assert(write(IN) === s""""IN"""")
assert(write(OUT) === s""""OUT"""")
assert(write(IN) === """{"$type":"fr.acinq.eclair.transactions.IN"}""")
assert(write(OUT) === """{"$type":"fr.acinq.eclair.transactions.OUT"}""")
}
test("serialize LocalParams") {
@ -93,6 +97,15 @@ class JsonSerializersSpec extends FunSuite {
println(write(localChanges))
}
test("serialize shaChain") {
val seed = Hash.Zeroes
var receiver = ShaChain.empty
for (i <- 0 until 7) {
receiver = receiver.addHash(ShaChain.shaChainFromSeed(seed, 0xFFFFFFFFFFFFL - i), 0xFFFFFFFFFFFFL - i)
}
println(write(receiver))
}
test("serialize Commitments") {
val commitments = ChannelStateSpec.commitments
println(write(commitments))