update payment channel actor to match spec
This commit is contained in:
parent
61a058a496
commit
27ad2700ec
@ -50,9 +50,6 @@ type PaymentChannelActorState struct {
|
|||||||
MinCloseHeight uint64
|
MinCloseHeight uint64
|
||||||
|
|
||||||
LaneStates map[uint64]*LaneState
|
LaneStates map[uint64]*LaneState
|
||||||
|
|
||||||
VerifActor address.Address
|
|
||||||
VerifMethod uint64
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pca PaymentChannelActor) Exports() []interface{} {
|
func (pca PaymentChannelActor) Exports() []interface{} {
|
||||||
@ -74,8 +71,6 @@ func (pca PaymentChannelActor) Constructor(act *types.Actor, vmctx types.VMConte
|
|||||||
var self PaymentChannelActorState
|
var self PaymentChannelActorState
|
||||||
self.From = vmctx.Origin()
|
self.From = vmctx.Origin()
|
||||||
self.To = params.To
|
self.To = params.To
|
||||||
self.VerifActor = params.VerifActor
|
|
||||||
self.VerifMethod = params.VerifMethod
|
|
||||||
|
|
||||||
storage := vmctx.Storage()
|
storage := vmctx.Storage()
|
||||||
c, err := storage.Put(self)
|
c, err := storage.Put(self)
|
||||||
@ -93,7 +88,7 @@ func (pca PaymentChannelActor) Constructor(act *types.Actor, vmctx types.VMConte
|
|||||||
type SignedVoucher struct {
|
type SignedVoucher struct {
|
||||||
TimeLock uint64
|
TimeLock uint64
|
||||||
SecretPreimage []byte
|
SecretPreimage []byte
|
||||||
Extra []byte
|
Extra *ModVerifyParams
|
||||||
Lane uint64
|
Lane uint64
|
||||||
Nonce uint64
|
Nonce uint64
|
||||||
Amount types.BigInt
|
Amount types.BigInt
|
||||||
@ -104,6 +99,12 @@ type SignedVoucher struct {
|
|||||||
Signature types.Signature
|
Signature types.Signature
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ModVerifyParams struct {
|
||||||
|
Actor address.Address
|
||||||
|
Method uint64
|
||||||
|
Data []byte
|
||||||
|
}
|
||||||
|
|
||||||
type Merge struct {
|
type Merge struct {
|
||||||
Lane uint64
|
Lane uint64
|
||||||
Nonce uint64
|
Nonce uint64
|
||||||
@ -144,40 +145,36 @@ func (pca PaymentChannelActor) UpdateChannelState(act *types.Actor, vmctx types.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if sv.Extra != nil {
|
if sv.Extra != nil {
|
||||||
if self.VerifActor == address.Undef {
|
encoded, err := SerializeParams([]interface{}{sv.Extra.Data, params.Proof})
|
||||||
return nil, aerrors.New(4, "no verifActor for extra data")
|
|
||||||
}
|
|
||||||
|
|
||||||
encoded, err := SerializeParams([]interface{}{sv.Extra, params.Proof})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = vmctx.Send(self.VerifActor, self.VerifMethod, types.NewInt(0), encoded)
|
_, err = vmctx.Send(sv.Extra.Actor, sv.Extra.Method, types.NewInt(0), encoded)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, aerrors.New(5, "spend voucher verification failed")
|
return nil, aerrors.New(4, "spend voucher verification failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ls := self.LaneStates[sv.Lane]
|
ls := self.LaneStates[sv.Lane]
|
||||||
if ls.Closed {
|
if ls.Closed {
|
||||||
return nil, aerrors.New(6, "cannot redeem a voucher on a closed lane")
|
return nil, aerrors.New(5, "cannot redeem a voucher on a closed lane")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ls.Nonce > sv.Nonce {
|
if ls.Nonce > sv.Nonce {
|
||||||
return nil, aerrors.New(7, "voucher has an outdated nonce, cannot redeem")
|
return nil, aerrors.New(6, "voucher has an outdated nonce, cannot redeem")
|
||||||
}
|
}
|
||||||
|
|
||||||
mergeValue := types.NewInt(0)
|
mergeValue := types.NewInt(0)
|
||||||
for _, merge := range sv.Merges {
|
for _, merge := range sv.Merges {
|
||||||
if merge.Lane == sv.Lane {
|
if merge.Lane == sv.Lane {
|
||||||
return nil, aerrors.New(8, "voucher cannot merge its own lane")
|
return nil, aerrors.New(7, "voucher cannot merge its own lane")
|
||||||
}
|
}
|
||||||
|
|
||||||
ols := self.LaneStates[merge.Lane]
|
ols := self.LaneStates[merge.Lane]
|
||||||
|
|
||||||
if ols.Nonce >= merge.Nonce {
|
if ols.Nonce >= merge.Nonce {
|
||||||
return nil, aerrors.New(9, "merge in voucher has outdated nonce, cannot redeem")
|
return nil, aerrors.New(8, "merge in voucher has outdated nonce, cannot redeem")
|
||||||
}
|
}
|
||||||
|
|
||||||
mergeValue = types.BigAdd(mergeValue, ols.Redeemed)
|
mergeValue = types.BigAdd(mergeValue, ols.Redeemed)
|
||||||
@ -191,11 +188,11 @@ func (pca PaymentChannelActor) UpdateChannelState(act *types.Actor, vmctx types.
|
|||||||
newSendBalance := types.BigAdd(self.ToSend, balanceDelta)
|
newSendBalance := types.BigAdd(self.ToSend, balanceDelta)
|
||||||
if types.BigCmp(newSendBalance, types.NewInt(0)) < 0 {
|
if types.BigCmp(newSendBalance, types.NewInt(0)) < 0 {
|
||||||
// TODO: is this impossible?
|
// TODO: is this impossible?
|
||||||
return nil, aerrors.New(10, "voucher would leave channel balance negative")
|
return nil, aerrors.New(9, "voucher would leave channel balance negative")
|
||||||
}
|
}
|
||||||
|
|
||||||
if types.BigCmp(newSendBalance, self.ChannelTotal) > 0 {
|
if types.BigCmp(newSendBalance, self.ChannelTotal) > 0 {
|
||||||
return nil, aerrors.New(11, "not enough funds in channel to cover voucher")
|
return nil, aerrors.New(10, "not enough funds in channel to cover voucher")
|
||||||
}
|
}
|
||||||
|
|
||||||
self.ToSend = newSendBalance
|
self.ToSend = newSendBalance
|
||||||
|
Loading…
Reference in New Issue
Block a user