Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Funding component for IoT State Channels #258

Merged
107 changes: 107 additions & 0 deletions api/grpc/funding.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// Copyright (c) 2023 - for information on the respective copyright owner
// see the NOTICE file and/or the repository at
// https://github.com/hyperledger-labs/perun-node
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package grpc

import (
"context"
"fmt"

pchannel "perun.network/go-perun/channel"

"github.com/hyperledger-labs/perun-node"
"github.com/hyperledger-labs/perun-node/api/grpc/pb"
)

// fundingServer represents a grpc server that can serve funding API.
type fundingServer struct {
pb.UnimplementedFunding_APIServer
n perun.NodeAPI
}

// Fund wraps session.Fund.
func (a *fundingServer) Fund(ctx context.Context, grpcReq *pb.FundReq) (*pb.FundResp, error) {
errResponse := func(err perun.APIError) *pb.FundResp {
return &pb.FundResp{
Error: pb.FromError(err),
}
}

sess, apiErr := a.n.GetSession(grpcReq.SessionID)
if apiErr != nil {
return errResponse(apiErr), nil
}
req, err := pb.ToFundingReq(grpcReq)
if err != nil {
return errResponse(perun.NewAPIErrUnknownInternal(err)), nil
}

err = sess.Fund(ctx, req)
if err != nil {
return errResponse(perun.NewAPIErrUnknownInternal(err)), nil
}

return &pb.FundResp{
Error: nil,
}, nil
}

// RegisterAssetERC20 is a stub that always returns false. Because, the remote
// funder does not support use of assets other than the default ERC20 asset.
//
// TODO: Make actual implementation.
func (a *payChAPIServer) RegisterAssetERC20(_ context.Context, _ *pb.RegisterAssetERC20Req) (
*pb.RegisterAssetERC20Resp, error,
) {
return &pb.RegisterAssetERC20Resp{
MsgSuccess: false,
}, nil
}

// IsAssetRegistered wraps session.IsAssetRegistered.
func (a *payChAPIServer) IsAssetRegistered(_ context.Context, req *pb.IsAssetRegisteredReq) (
*pb.IsAssetRegisteredResp,
error,
) {
errResponse := func(err perun.APIError) *pb.IsAssetRegisteredResp {
return &pb.IsAssetRegisteredResp{
Response: &pb.IsAssetRegisteredResp_Error{
Error: pb.FromError(err),
},
}
}

sess, err := a.n.GetSession(req.SessionID)
if err != nil {
return errResponse(err), nil
}
asset := pchannel.NewAsset()
err2 := asset.UnmarshalBinary(req.Asset)
if err2 != nil {
err = perun.NewAPIErrInvalidArgument(err2, "asset", fmt.Sprintf("%x", req.Asset))
return errResponse(err), nil
}

isRegistered := sess.IsAssetRegistered(asset)

return &pb.IsAssetRegisteredResp{
Response: &pb.IsAssetRegisteredResp_MsgSuccess_{
MsgSuccess: &pb.IsAssetRegisteredResp_MsgSuccess{
IsRegistered: isRegistered,
},
},
}, nil
}
58 changes: 29 additions & 29 deletions api/grpc/payment.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func (a *payChAPIServer) RegisterCurrency(_ context.Context, req *pb.RegisterCur
errResponse := func(err perun.APIError) *pb.RegisterCurrencyResp {
return &pb.RegisterCurrencyResp{
Response: &pb.RegisterCurrencyResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -107,7 +107,7 @@ func (a *payChAPIServer) OpenSession(_ context.Context, req *pb.OpenSessionReq)
errResponse := func(err perun.APIError) *pb.OpenSessionResp {
return &pb.OpenSessionResp{
Response: &pb.OpenSessionResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -125,7 +125,7 @@ func (a *payChAPIServer) OpenSession(_ context.Context, req *pb.OpenSessionReq)
Response: &pb.OpenSessionResp_MsgSuccess_{
MsgSuccess: &pb.OpenSessionResp_MsgSuccess{
SessionID: sessionID,
RestoredChs: toGrpcPayChsInfo(restoredChs),
RestoredChs: pb.FromPayChsInfo(restoredChs),
},
},
}, nil
Expand All @@ -136,7 +136,7 @@ func (a *payChAPIServer) AddPeerID(_ context.Context, req *pb.AddPeerIDReq) (*pb
errResponse := func(err perun.APIError) *pb.AddPeerIDResp {
return &pb.AddPeerIDResp{
Response: &pb.AddPeerIDResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -169,7 +169,7 @@ func (a *payChAPIServer) GetPeerID(_ context.Context, req *pb.GetPeerIDReq) (*pb
errResponse := func(err perun.APIError) *pb.GetPeerIDResp {
return &pb.GetPeerIDResp{
Response: &pb.GetPeerIDResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -202,7 +202,7 @@ func (a *payChAPIServer) OpenPayCh(ctx context.Context, req *pb.OpenPayChReq) (*
errResponse := func(err perun.APIError) *pb.OpenPayChResp {
return &pb.OpenPayChResp{
Response: &pb.OpenPayChResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -211,7 +211,7 @@ func (a *payChAPIServer) OpenPayCh(ctx context.Context, req *pb.OpenPayChReq) (*
if err != nil {
return errResponse(err), nil
}
openingBalInfo := fromGrpcBalInfo(req.OpeningBalInfo)
openingBalInfo := pb.ToBalInfo(req.OpeningBalInfo)
payChInfo, err := payment.OpenPayCh(ctx, sess, openingBalInfo, req.ChallengeDurSecs)
if err != nil {
return errResponse(err), nil
Expand All @@ -222,7 +222,7 @@ func (a *payChAPIServer) OpenPayCh(ctx context.Context, req *pb.OpenPayChReq) (*
MsgSuccess: &pb.OpenPayChResp_MsgSuccess{
OpenedPayChInfo: &pb.PayChInfo{
ChID: payChInfo.ChID,
BalInfo: ToGrpcBalInfo(payChInfo.BalInfo),
BalInfo: pb.FromBalInfo(payChInfo.BalInfo),
Version: payChInfo.Version,
},
},
Expand All @@ -235,7 +235,7 @@ func (a *payChAPIServer) GetPayChsInfo(_ context.Context, req *pb.GetPayChsInfoR
errResponse := func(err perun.APIError) *pb.GetPayChsInfoResp {
return &pb.GetPayChsInfoResp{
Response: &pb.GetPayChsInfoResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -252,7 +252,7 @@ func (a *payChAPIServer) GetPayChsInfo(_ context.Context, req *pb.GetPayChsInfoR
return &pb.GetPayChsInfoResp{
Response: &pb.GetPayChsInfoResp_MsgSuccess_{
MsgSuccess: &pb.GetPayChsInfoResp_MsgSuccess{
OpenPayChsInfo: toGrpcPayChsInfo(openPayChsInfo),
OpenPayChsInfo: pb.FromPayChsInfo(openPayChsInfo),
},
},
}, nil
Expand All @@ -272,7 +272,7 @@ func (a *payChAPIServer) SubPayChProposals(req *pb.SubPayChProposalsReq,
err := srv.Send(&pb.SubPayChProposalsResp{Response: &pb.SubPayChProposalsResp_Notify_{
Notify: &pb.SubPayChProposalsResp_Notify{
ProposalID: notif.ProposalID,
OpeningBalInfo: ToGrpcBalInfo(notif.OpeningBalInfo),
OpeningBalInfo: pb.FromBalInfo(notif.OpeningBalInfo),
ChallengeDurSecs: notif.ChallengeDurSecs,
Expiry: notif.Expiry,
},
Expand Down Expand Up @@ -304,7 +304,7 @@ func (a *payChAPIServer) UnsubPayChProposals(_ context.Context, req *pb.UnsubPay
errResponse := func(err perun.APIError) *pb.UnsubPayChProposalsResp {
return &pb.UnsubPayChProposalsResp{
Response: &pb.UnsubPayChProposalsResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -344,7 +344,7 @@ func (a *payChAPIServer) RespondPayChProposal(ctx context.Context, req *pb.Respo
errResponse := func(err perun.APIError) *pb.RespondPayChProposalResp {
return &pb.RespondPayChProposalResp{
Response: &pb.RespondPayChProposalResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -361,7 +361,7 @@ func (a *payChAPIServer) RespondPayChProposal(ctx context.Context, req *pb.Respo
return &pb.RespondPayChProposalResp{
Response: &pb.RespondPayChProposalResp_MsgSuccess_{
MsgSuccess: &pb.RespondPayChProposalResp_MsgSuccess{
OpenedPayChInfo: toGrpcPayChInfo(openedPayChInfo),
OpenedPayChInfo: pb.FromPayChInfo(openedPayChInfo),
},
},
}, nil
Expand All @@ -372,7 +372,7 @@ func (a *payChAPIServer) CloseSession(_ context.Context, req *pb.CloseSessionReq
errResponse := func(err perun.APIError) *pb.CloseSessionResp {
return &pb.CloseSessionResp{
Response: &pb.CloseSessionResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -389,7 +389,7 @@ func (a *payChAPIServer) CloseSession(_ context.Context, req *pb.CloseSessionReq
return &pb.CloseSessionResp{
Response: &pb.CloseSessionResp_MsgSuccess_{
MsgSuccess: &pb.CloseSessionResp_MsgSuccess{
OpenPayChsInfo: toGrpcPayChsInfo(openPayChsInfo),
OpenPayChsInfo: pb.FromPayChsInfo(openPayChsInfo),
},
},
}, nil
Expand All @@ -402,7 +402,7 @@ func (a *payChAPIServer) DeployAssetERC20(_ context.Context, req *pb.DeployAsset
errResponse := func(err perun.APIError) *pb.DeployAssetERC20Resp {
return &pb.DeployAssetERC20Resp{
Response: &pb.DeployAssetERC20Resp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -432,7 +432,7 @@ func (a *payChAPIServer) SendPayChUpdate(ctx context.Context, req *pb.SendPayChU
errResponse := func(err perun.APIError) *pb.SendPayChUpdateResp {
return &pb.SendPayChUpdateResp{
Response: &pb.SendPayChUpdateResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -445,15 +445,15 @@ func (a *payChAPIServer) SendPayChUpdate(ctx context.Context, req *pb.SendPayChU
if err != nil {
return errResponse(err), nil
}
updatedPayChInfo, err := payment.SendPayChUpdate(ctx, ch, fromGrpcPayments(req.Payments))
updatedPayChInfo, err := payment.SendPayChUpdate(ctx, ch, pb.ToPayments(req.Payments))
if err != nil {
return errResponse(err), nil
}

return &pb.SendPayChUpdateResp{
Response: &pb.SendPayChUpdateResp_MsgSuccess_{
MsgSuccess: &pb.SendPayChUpdateResp_MsgSuccess{
UpdatedPayChInfo: toGrpcPayChInfo(updatedPayChInfo),
UpdatedPayChInfo: pb.FromPayChInfo(updatedPayChInfo),
},
},
}, nil
Expand All @@ -474,13 +474,13 @@ func (a *payChAPIServer) SubPayChUpdates(req *pb.SubpayChUpdatesReq, srv pb.Paym
notifier := func(notif payment.PayChUpdateNotif) {
var notifErr *pb.MsgError
if notif.Error != nil {
notifErr = toGrpcError(notif.Error)
notifErr = pb.FromError(notif.Error)
}

err := srv.Send(&pb.SubPayChUpdatesResp{Response: &pb.SubPayChUpdatesResp_Notify_{
Notify: &pb.SubPayChUpdatesResp_Notify{
UpdateID: notif.UpdateID,
ProposedPayChInfo: toGrpcPayChInfo(notif.ProposedPayChInfo),
ProposedPayChInfo: pb.FromPayChInfo(notif.ProposedPayChInfo),
Type: ToGrpcChUpdateType[notif.Type],
Expiry: notif.Expiry,
Error: notifErr,
Expand Down Expand Up @@ -526,7 +526,7 @@ func (a *payChAPIServer) UnsubPayChUpdates(_ context.Context, req *pb.UnsubPayCh
errResponse := func(err perun.APIError) *pb.UnsubPayChUpdatesResp {
return &pb.UnsubPayChUpdatesResp{
Response: &pb.UnsubPayChUpdatesResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand Down Expand Up @@ -568,7 +568,7 @@ func (a *payChAPIServer) RespondPayChUpdate(ctx context.Context, req *pb.Respond
errResponse := func(err perun.APIError) *pb.RespondPayChUpdateResp {
return &pb.RespondPayChUpdateResp{
Response: &pb.RespondPayChUpdateResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -589,7 +589,7 @@ func (a *payChAPIServer) RespondPayChUpdate(ctx context.Context, req *pb.Respond
return &pb.RespondPayChUpdateResp{
Response: &pb.RespondPayChUpdateResp_MsgSuccess_{
MsgSuccess: &pb.RespondPayChUpdateResp_MsgSuccess{
UpdatedPayChInfo: toGrpcPayChInfo(updatedPayChInfo),
UpdatedPayChInfo: pb.FromPayChInfo(updatedPayChInfo),
},
},
}, nil
Expand All @@ -602,7 +602,7 @@ func (a *payChAPIServer) GetPayChInfo(_ context.Context, req *pb.GetPayChInfoReq
errResponse := func(err perun.APIError) *pb.GetPayChInfoResp {
return &pb.GetPayChInfoResp{
Response: &pb.GetPayChInfoResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -623,7 +623,7 @@ func (a *payChAPIServer) GetPayChInfo(_ context.Context, req *pb.GetPayChInfoReq
return &pb.GetPayChInfoResp{
Response: &pb.GetPayChInfoResp_MsgSuccess_{
MsgSuccess: &pb.GetPayChInfoResp_MsgSuccess{
PayChInfo: toGrpcPayChInfo(payChInfo),
PayChInfo: pb.FromPayChInfo(payChInfo),
},
},
}, nil
Expand All @@ -634,7 +634,7 @@ func (a *payChAPIServer) ClosePayCh(ctx context.Context, req *pb.ClosePayChReq)
errResponse := func(err perun.APIError) *pb.ClosePayChResp {
return &pb.ClosePayChResp{
Response: &pb.ClosePayChResp_Error{
Error: toGrpcError(err),
Error: pb.FromError(err),
},
}
}
Expand All @@ -655,7 +655,7 @@ func (a *payChAPIServer) ClosePayCh(ctx context.Context, req *pb.ClosePayChReq)
return &pb.ClosePayChResp{
Response: &pb.ClosePayChResp_MsgSuccess_{
MsgSuccess: &pb.ClosePayChResp_MsgSuccess{
ClosedPayChInfo: toGrpcPayChInfo(closedPayChInfo),
ClosedPayChInfo: pb.FromPayChInfo(closedPayChInfo),
},
},
}, nil
Expand Down
4 changes: 2 additions & 2 deletions api/grpc/payment_integ_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ func AddPeerID(t *testing.T, sessionID string, peerID *pb.PeerID) {
func OpenPayCh(t *testing.T, sessionID string, currencies, parts []string, bals [][]string, wantErr bool) string {
req := pb.OpenPayChReq{
SessionID: sessionID,
OpeningBalInfo: grpc.ToGrpcBalInfo(perun.BalInfo{
OpeningBalInfo: pb.FromBalInfo(perun.BalInfo{
Currencies: currencies,
Parts: parts,
Bals: bals,
Expand Down Expand Up @@ -519,7 +519,7 @@ func SendPayChUpdate(t *testing.T, sessionID, chID string, payments []payment.Pa
req := pb.SendPayChUpdateReq{
SessionID: sessionID,
ChID: chID,
Payments: grpc.ToGrpcPayments(payments),
Payments: pb.FromPayments(payments),
}
resp, err := client.SendPayChUpdate(ctx, &req)
require.NoErrorf(t, err, "SendPayChUpdate")
Expand Down
Loading