1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-02-22 14:22:39 +01:00

shachain: addHash is just a bit less ugly

This commit is contained in:
sstone 2015-09-01 00:00:53 +02:00
parent 704f02daad
commit d832db205b
2 changed files with 9 additions and 5 deletions

View file

@ -28,13 +28,16 @@ object ShaChain {
def addHash(chain: ShaChain, hash: BinaryData, index: Long) : ShaChain = {
require(index == chain.maxIndex + 1 || (index == 0 && chain.knownHashes.isEmpty))
chain.knownHashes.zipWithIndex.find {case (k, i) => canDerive(index, k.index) } match {
case Some((KnownHash(h, i), pos)) =>
def updateKnownHashes(knowHashes: Seq[KnownHash], acc: Seq[KnownHash] = Seq.empty[KnownHash]) : Seq[KnownHash] = knowHashes match {
case Nil => acc :+ KnownHash(hash, index)
case KnownHash(h, i) :: tail if canDerive(index, i) =>
val expected: BinaryData = derive(hash, index, i)
require(h == expected)
chain.copy(maxIndex = index, knownHashes = chain.knownHashes.updated(pos, KnownHash(hash, index)).take(pos + 1))
case None => chain.copy(maxIndex = index, knownHashes = chain.knownHashes :+ KnownHash(hash, index))
acc :+ KnownHash(hash, index)
case head :: tail => updateKnownHashes(tail, acc :+ head)
}
chain.copy(maxIndex = index, knownHashes = updateKnownHashes(chain.knownHashes))
}
def getHash(chain: ShaChain, index: Long) : Option[BinaryData] = {

View file

@ -71,7 +71,8 @@ class ShaChainSpec extends FunSuite {
chain = ShaChain.addHash(chain, expect(i), i)
for(j <- 0 to i) {
val hash = ShaChain.getHash(chain, j)
assert(hash == Some(expect(j)))
val expected = expect(j)
assert(hash == Some(expected))
}
assert(ShaChain.getHash(chain, i + 1) == None)
}