mirror of
https://github.com/ACINQ/eclair.git
synced 2025-02-22 22:25:26 +01:00
wip (not working)
This commit is contained in:
parent
70f85bfcbb
commit
6d6f1f7740
2 changed files with 82 additions and 12 deletions
|
@ -37,4 +37,22 @@ object Boot extends App {
|
||||||
blockid = Some(sha256_hash(1, 1, 1, 1))
|
blockid = Some(sha256_hash(1, 1, 1, 1))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
node ! update_add_htlc(
|
||||||
|
revocationHash = sha256_hash(1, 1, 1, 1),
|
||||||
|
amount = 1000,
|
||||||
|
rHash = sha256_hash(1, 1, 1, 1),
|
||||||
|
expiry = locktime(Blocks(4)))
|
||||||
|
|
||||||
|
node ! update_signature(
|
||||||
|
sig = signature(1, 1, 1, 1, 0, 0, 0, 0),
|
||||||
|
revocationPreimage = sha256_hash(1, 1, 1, 1))
|
||||||
|
|
||||||
|
// this is sent by the next node
|
||||||
|
node ! update_complete_htlc(
|
||||||
|
revocationHash = sha256_hash(1, 1, 1, 1),
|
||||||
|
r = sha256_hash(1, 1, 1, 1))
|
||||||
|
|
||||||
|
node ! update_signature(
|
||||||
|
sig = signature(1, 1, 1, 1, 0, 0, 0, 0),
|
||||||
|
revocationPreimage = sha256_hash(1, 1, 1, 1))
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,40 +14,56 @@ case object OPEN_WAIT_FOR_ANCHOR extends State
|
||||||
case object OPEN_WAITING extends State
|
case object OPEN_WAITING extends State
|
||||||
case object OPEN_WAIT_FOR_COMPLETE extends State
|
case object OPEN_WAIT_FOR_COMPLETE extends State
|
||||||
case object NORMAL extends State
|
case object NORMAL extends State
|
||||||
|
case object WAIT_FOR_HTLC_ACCEPT extends State
|
||||||
|
case object WAIT_FOR_UPDATE_COMPLETE extends State
|
||||||
|
case object WAIT_FOR_UPDATE_SIG extends State
|
||||||
|
|
||||||
sealed trait Data
|
sealed trait Data
|
||||||
case object Uninitialized extends Data
|
case object Uninitialized extends Data
|
||||||
final case class ChannelParams(revocationHash: sha256_hash, minDepth: Int) extends Data
|
final case class ChannelParams(minDepth: Int) extends Data
|
||||||
|
final case class OurSimpleCommitmentTx(theirRevocationHash: sha256_hash, theirSig: Option[signature])
|
||||||
|
final case class TheirSimpleCommitmentTx(ourRevocationPreimage: sha256_hash, ourSig: Option[signature])
|
||||||
|
final case class SimpleCommitmentTxData(params: ChannelParams, ourCommitTx: OurSimpleCommitmentTx, theirCommitmentTx: TheirSimpleCommitmentTx) extends Data
|
||||||
|
final case class HTLCCommitTxData() extends Data
|
||||||
|
|
||||||
|
|
||||||
//blockchain events
|
//blockchain events
|
||||||
sealed trait BlockchainEvent
|
sealed trait BlockchainEvent
|
||||||
final case class TxConfirmed(confirmations: Int)
|
final case class TxConfirmed(confirmations: Int)
|
||||||
|
|
||||||
|
//commands
|
||||||
|
sealed trait Commands
|
||||||
|
final case class SendHtlcUpdate(amount: Long, finalPayee: String, rHash: sha256_hash)
|
||||||
|
|
||||||
class Node extends LoggingFSM[State, Data] {
|
class Node extends LoggingFSM[State, Data] {
|
||||||
|
|
||||||
startWith(OPEN_WAIT_FOR_OPEN_NOANCHOR, Uninitialized)
|
startWith(OPEN_WAIT_FOR_OPEN_NOANCHOR, Uninitialized)
|
||||||
|
|
||||||
when(OPEN_WAIT_FOR_OPEN_NOANCHOR) {
|
when(OPEN_WAIT_FOR_OPEN_NOANCHOR) {
|
||||||
case Event(open_channel(delay, revocationHash, commitKey, finalKey, WILL_CREATE_ANCHOR, minDepth, commitmentFee), Uninitialized) =>
|
case Event(open_channel(delay, revocationHash, commitKey, finalKey, WILL_CREATE_ANCHOR, minDepth, commitmentFee), Uninitialized) =>
|
||||||
// Nothing to do here, we wait for the anchor
|
val ourRevocationHashPreimage = sha256_hash(1, 1, 1, 1)
|
||||||
goto(OPEN_WAIT_FOR_ANCHOR) using ChannelParams(revocationHash, minDepth.get) // minDepth has a default value in the .proto
|
val ourRevocationHash = sha256_hash(1, 1, 1, 1)
|
||||||
|
// TODO : open_channel(delay, ourRevocationHash, commitKey, finalKey, WONT_CREATE_ANCHOR, minDepth, commitmentFee)
|
||||||
|
goto(OPEN_WAIT_FOR_ANCHOR) using SimpleCommitmentTxData(ChannelParams(2), OurSimpleCommitmentTx(revocationHash, None), TheirSimpleCommitmentTx(ourRevocationHashPreimage, None))
|
||||||
}
|
}
|
||||||
|
|
||||||
when(OPEN_WAIT_FOR_ANCHOR) {
|
when(OPEN_WAIT_FOR_ANCHOR) {
|
||||||
case Event(open_anchor(txid, outputIndex, amount, commitSig), params@ChannelParams(revocationHash, _)) =>
|
case Event(open_anchor(txid, outputIndex, amount, commitSig), SimpleCommitmentTxData(params, ourCommitTx, theirCommitmentTx)) =>
|
||||||
// TODO : sign commitment tx
|
// TODO : build our commitment tx and check counterparty's sig
|
||||||
// TODO : reply with commit tx sig
|
// TODO : build counterparty's commitment tx and sign it
|
||||||
|
val ourSig = signature(1, 1, 1, 1, 0, 0, 0, 0)
|
||||||
|
// TODO : reply with open_commit_sig(sig)
|
||||||
// TODO : register for confirmations of anchor tx on the bitcoin network
|
// TODO : register for confirmations of anchor tx on the bitcoin network
|
||||||
goto(OPEN_WAITING)
|
goto(OPEN_WAITING) using SimpleCommitmentTxData(params, ourCommitTx.copy(theirSig = Some(commitSig)), theirCommitmentTx.copy(ourSig = Some(ourSig)))
|
||||||
}
|
}
|
||||||
|
|
||||||
when(OPEN_WAITING) {
|
when(OPEN_WAITING) {
|
||||||
case Event(TxConfirmed(confirmations), params@ChannelParams(_, minDepth)) if confirmations < minDepth =>
|
case Event(TxConfirmed(confirmations), SimpleCommitmentTxData(ChannelParams(minDepth), _, _)) if confirmations < minDepth =>
|
||||||
log.info(s"got $confirmations confirmation(s) for anchor tx")
|
log.info(s"got $confirmations confirmation(s) for anchor tx")
|
||||||
stay
|
stay
|
||||||
case Event(TxConfirmed(confirmations), params@ChannelParams(_, minDepth)) if confirmations >= minDepth =>
|
case Event(TxConfirmed(confirmations), SimpleCommitmentTxData(ChannelParams(minDepth), _, _)) if confirmations >= minDepth =>
|
||||||
log.info(s"got $confirmations confirmation(s) for anchor tx, minDepth reached")
|
log.info(s"got $confirmations confirmation(s) for anchor tx, minDepth reached")
|
||||||
//TODO : send open complete message
|
// TODO : send open_complete(blockid)
|
||||||
goto(OPEN_WAIT_FOR_COMPLETE)
|
goto(OPEN_WAIT_FOR_COMPLETE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,8 +73,44 @@ class Node extends LoggingFSM[State, Data] {
|
||||||
}
|
}
|
||||||
|
|
||||||
when(NORMAL) {
|
when(NORMAL) {
|
||||||
case Event(_, _) =>
|
/*case Event(SendHtlcUpdate(amount), _) =>
|
||||||
stay
|
// TODO : we should reach the final payee, and get a rHash, and an expiry (which depends on the route)
|
||||||
|
// TODO : send update_add_htlc(revocationHash, amount, rHash, expiry)
|
||||||
|
goto(WAIT_FOR_HTLC_ACCEPT)*/
|
||||||
|
|
||||||
|
case Event(update_add_htlc(revocationHash, amount, rHash, expiry), _) =>
|
||||||
|
// TODO : we should probably check that we can reach the next node (which can be the final payee) using routing info that will be provided in the msg
|
||||||
|
// TODO : reply with send update_accept(sig, revocationHash) ; note that this tx increases our balance so there is no risk in signing it
|
||||||
|
// TODO : send update_add_htlc(revocationHash, amount, rHash, expiry - 1) *to the next node*
|
||||||
|
goto(WAIT_FOR_UPDATE_SIG)
|
||||||
|
|
||||||
|
case Event(update_complete_htlc(revocationHash, r), _) => // we get that from the *next node*
|
||||||
|
// TODO : send update_accept(sig, revocationHash)
|
||||||
|
goto(WAIT_FOR_UPDATE_SIG)
|
||||||
|
}
|
||||||
|
|
||||||
|
when(WAIT_FOR_UPDATE_SIG) {
|
||||||
|
case Event(update_signature(sig, revocationPreimage), x: SimpleCommitmentTxData) =>
|
||||||
|
// counterparty replied with the signature for its new commitment tx, and revocationPreimage
|
||||||
|
// TODO : check that revocationPreimage indeed hashes to the revocationHash gave us previously
|
||||||
|
// TODO : reply with update_complete(revocationPreimage) which revokes previous commit tx
|
||||||
|
goto(NORMAL)
|
||||||
|
|
||||||
|
case Event(update_signature(sig, revocationPreimage), x: HTLCCommitTxData) =>
|
||||||
|
// TODO : reply with update_complete(revocationPreimage) which revokes previous commit tx
|
||||||
|
goto(NORMAL)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*when(WAIT_FOR_HTLC_ACCEPT) {
|
||||||
|
case Event(update_accept(sig, revocationHash), _) =>
|
||||||
|
// TODO : ???
|
||||||
|
goto(WAIT_FOR_UPDATE_COMPLETE)
|
||||||
|
}*/
|
||||||
|
|
||||||
|
when(WAIT_FOR_UPDATE_COMPLETE) {
|
||||||
|
case Event(update_complete(revocationPreimage), _) =>
|
||||||
|
// TODO : ???
|
||||||
|
goto(NORMAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue