Commit 3e6c0f5b authored by Caro Axel's avatar Caro Axel Committed by Loïck Bonniot

[ci skip] Peer connection

parent c4bf4406
......@@ -23,3 +23,9 @@ package:
deploy:
mkdir -p /deploy/$(VERSION)
cp release/*.tar.gz /deploy/$(VERSION)/
protobuf:
cd .. && \
protoc --go_out=plugins=grpc:. dfss/dfssc/api/client.proto && \
protoc --go_out=plugins=grpc:. dfss/dfssd/api/demonstrator.proto && \
protoc --go_out=plugins=grpc:. dfss/dfssp/api/platform.proto
\ No newline at end of file
// Code generated by protoc-gen-go.
// source: dfss/dfssc/api/client.proto
// DO NOT EDIT!
/*
Package api is a generated protocol buffer package.
It is generated from these files:
dfss/dfssc/api/client.proto
It has these top-level messages:
Promise
Signature
Hello
*/
package api
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import api1 "dfss/dfssp/api"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
const _ = proto.ProtoPackageIsVersion1
// Promise message contains all the required information to verify
// the identity of the sender and reciever, and the actual promess
type Promise struct {
RecipientKeyHash []byte `protobuf:"bytes,1,opt,name=recipientKeyHash,proto3" json:"recipientKeyHash,omitempty"`
SenderKeyHash []byte `protobuf:"bytes,2,opt,name=senderKeyHash,proto3" json:"senderKeyHash,omitempty"`
SignatureUuid string `protobuf:"bytes,3,opt,name=signatureUuid" json:"signatureUuid,omitempty"`
ContractUuid string `protobuf:"bytes,4,opt,name=contractUuid" json:"contractUuid,omitempty"`
}
func (m *Promise) Reset() { *m = Promise{} }
func (m *Promise) String() string { return proto.CompactTextString(m) }
func (*Promise) ProtoMessage() {}
func (*Promise) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
// Signature message contains all the required information to verify
// the identity of the sender and reciever, and the actual signature
type Signature struct {
RecipientKeyHash []byte `protobuf:"bytes,1,opt,name=recipientKeyHash,proto3" json:"recipientKeyHash,omitempty"`
SenderKeyHash []byte `protobuf:"bytes,2,opt,name=senderKeyHash,proto3" json:"senderKeyHash,omitempty"`
Signature string `protobuf:"bytes,3,opt,name=signature" json:"signature,omitempty"`
SignatureUuid string `protobuf:"bytes,4,opt,name=signatureUuid" json:"signatureUuid,omitempty"`
ContractUuid string `protobuf:"bytes,5,opt,name=contractUuid" json:"contractUuid,omitempty"`
}
func (m *Signature) Reset() { *m = Signature{} }
func (m *Signature) String() string { return proto.CompactTextString(m) }
func (*Signature) ProtoMessage() {}
func (*Signature) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
// Hello message is used when discovering peers. It contains the current version of the software.
type Hello struct {
Version string `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"`
}
func (m *Hello) Reset() { *m = Hello{} }
func (m *Hello) String() string { return proto.CompactTextString(m) }
func (*Hello) ProtoMessage() {}
func (*Hello) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func init() {
proto.RegisterType((*Promise)(nil), "api.Promise")
proto.RegisterType((*Signature)(nil), "api.Signature")
proto.RegisterType((*Hello)(nil), "api.Hello")
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// Client API for Client service
type ClientClient interface {
TreatPromise(ctx context.Context, in *Promise, opts ...grpc.CallOption) (*api1.ErrorCode, error)
TreatSignature(ctx context.Context, in *Signature, opts ...grpc.CallOption) (*api1.ErrorCode, error)
Discover(ctx context.Context, in *Hello, opts ...grpc.CallOption) (*Hello, error)
}
type clientClient struct {
cc *grpc.ClientConn
}
func NewClientClient(cc *grpc.ClientConn) ClientClient {
return &clientClient{cc}
}
func (c *clientClient) TreatPromise(ctx context.Context, in *Promise, opts ...grpc.CallOption) (*api1.ErrorCode, error) {
out := new(api1.ErrorCode)
err := grpc.Invoke(ctx, "/api.Client/TreatPromise", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientClient) TreatSignature(ctx context.Context, in *Signature, opts ...grpc.CallOption) (*api1.ErrorCode, error) {
out := new(api1.ErrorCode)
err := grpc.Invoke(ctx, "/api.Client/TreatSignature", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientClient) Discover(ctx context.Context, in *Hello, opts ...grpc.CallOption) (*Hello, error) {
out := new(Hello)
err := grpc.Invoke(ctx, "/api.Client/Discover", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Client service
type ClientServer interface {
TreatPromise(context.Context, *Promise) (*api1.ErrorCode, error)
TreatSignature(context.Context, *Signature) (*api1.ErrorCode, error)
Discover(context.Context, *Hello) (*Hello, error)
}
func RegisterClientServer(s *grpc.Server, srv ClientServer) {
s.RegisterService(&_Client_serviceDesc, srv)
}
func _Client_TreatPromise_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
in := new(Promise)
if err := dec(in); err != nil {
return nil, err
}
out, err := srv.(ClientServer).TreatPromise(ctx, in)
if err != nil {
return nil, err
}
return out, nil
}
func _Client_TreatSignature_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
in := new(Signature)
if err := dec(in); err != nil {
return nil, err
}
out, err := srv.(ClientServer).TreatSignature(ctx, in)
if err != nil {
return nil, err
}
return out, nil
}
func _Client_Discover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
in := new(Hello)
if err := dec(in); err != nil {
return nil, err
}
out, err := srv.(ClientServer).Discover(ctx, in)
if err != nil {
return nil, err
}
return out, nil
}
var _Client_serviceDesc = grpc.ServiceDesc{
ServiceName: "api.Client",
HandlerType: (*ClientServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "TreatPromise",
Handler: _Client_TreatPromise_Handler,
},
{
MethodName: "TreatSignature",
Handler: _Client_TreatSignature_Handler,
},
{
MethodName: "Discover",
Handler: _Client_Discover_Handler,
},
},
Streams: []grpc.StreamDesc{},
}
var fileDescriptor0 = []byte{
// 302 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x92, 0x4f, 0x4e, 0xf3, 0x30,
0x10, 0xc5, 0x9b, 0xaf, 0xff, 0xbe, 0x8c, 0x42, 0x85, 0xbc, 0xaa, 0x02, 0x48, 0x10, 0x75, 0x81,
0x58, 0x24, 0x52, 0x39, 0x42, 0x41, 0xaa, 0xc4, 0x06, 0x05, 0x38, 0x80, 0x71, 0xa6, 0x60, 0x29,
0x8d, 0xa3, 0xb1, 0x8b, 0xc4, 0x35, 0xb8, 0x03, 0x47, 0xe1, 0x5e, 0xa4, 0xd3, 0x26, 0x25, 0x6a,
0x17, 0x6c, 0xd8, 0x44, 0x79, 0xcf, 0xbf, 0xb1, 0xdf, 0x78, 0x0c, 0x27, 0xd9, 0xc2, 0xda, 0x64,
0xfd, 0x51, 0x89, 0x2c, 0x75, 0xa2, 0x72, 0x8d, 0x85, 0x8b, 0x4b, 0x32, 0xce, 0x88, 0x6e, 0xe5,
0x84, 0x67, 0x0d, 0x51, 0x32, 0x51, 0xe6, 0xd2, 0x2d, 0x0c, 0x2d, 0x37, 0x4c, 0xf4, 0xe9, 0xc1,
0xf0, 0x9e, 0xcc, 0x52, 0x5b, 0x14, 0x57, 0x70, 0x4c, 0xa8, 0x74, 0xb9, 0xde, 0xe2, 0x0e, 0xdf,
0xe7, 0xd2, 0xbe, 0x8e, 0xbd, 0x73, 0xef, 0x32, 0x48, 0xf7, 0x7c, 0x31, 0x81, 0x23, 0x8b, 0x45,
0x86, 0x54, 0x83, 0xff, 0x18, 0x6c, 0x9b, 0x4c, 0xe9, 0x97, 0x42, 0xba, 0x15, 0xe1, 0xd3, 0x4a,
0x67, 0xe3, 0x6e, 0x45, 0xf9, 0x69, 0xdb, 0x14, 0x11, 0x04, 0xca, 0x14, 0x8e, 0xa4, 0x72, 0x0c,
0xf5, 0x18, 0x6a, 0x79, 0xd1, 0x97, 0x07, 0xfe, 0x43, 0x5d, 0xf5, 0x07, 0x49, 0x4f, 0xc1, 0x6f,
0x42, 0x6d, 0x53, 0xee, 0x8c, 0xfd, 0x3e, 0x7a, 0xbf, 0xe9, 0xa3, 0x7f, 0xa0, 0x8f, 0x0b, 0xe8,
0xcf, 0x31, 0xcf, 0x8d, 0x18, 0xc3, 0xf0, 0x0d, 0xc9, 0x6a, 0x53, 0x70, 0x72, 0x3f, 0xad, 0xe5,
0xf4, 0xc3, 0x83, 0xc1, 0x8c, 0xe7, 0x28, 0x62, 0x08, 0x1e, 0x09, 0xa5, 0xab, 0x27, 0x14, 0xc4,
0xd5, 0x08, 0xe3, 0xad, 0x0a, 0x47, 0xac, 0x6e, 0x89, 0x0c, 0xcd, 0x4c, 0x86, 0x51, 0x47, 0x4c,
0x61, 0xc4, 0xfc, 0xee, 0xa6, 0x36, 0x4c, 0xa3, 0x0f, 0xd4, 0x4c, 0xe0, 0xff, 0x8d, 0xb6, 0xca,
0x54, 0xc7, 0x0b, 0xe0, 0x55, 0x0e, 0x18, 0xfe, 0xf8, 0x8f, 0x3a, 0xcf, 0x03, 0x7e, 0x2e, 0xd7,
0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x73, 0x57, 0xa2, 0x71, 0x02, 0x00, 0x00,
}
syntax = "proto3";
package api;
import "dfss/dfssp/api/platform.proto";
service Client {
rpc TreatPromise(Promise) returns (ErrorCode) {}
rpc TreatSignature(Signature) returns (ErrorCode) {}
rpc Discover(Hello) returns (Hello) {}
}
// Promise message contains all the required information to verify
// the identity of the sender and reciever, and the actual promess
message Promise {
bytes recipientKeyHash = 1; // SHA-512
bytes senderKeyHash = 2; // SHA-512
string signatureUuid = 3;
string contractUuid = 4;
}
// Signature message contains all the required information to verify
// the identity of the sender and reciever, and the actual signature
message Signature {
bytes recipientKeyHash = 1; // SHA-512
bytes senderKeyHash = 2; // SHA-512
string signature = 3; // Cryptographic signature
string signatureUuid = 4;
string contractUuid = 5;
}
// Hello message is used when discovering peers. It contains the current version of the software.
message Hello {
string version = 1;
}
\ No newline at end of file
package sign
import (
"fmt"
"dfss"
cAPI "dfss/dfssc/api"
pAPI "dfss/dfssp/api"
"dfss/net"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
type clientServer struct{}
// TreatPromise handler
//
// Handle incoming TreatPromise messages
func (s *clientServer) TreatPromise(ctx context.Context, in *cAPI.Promise) (*pAPI.ErrorCode, error) {
// TODO
return nil, nil
}
// TreatSignature handler
//
// Handle incoming TreatSignature messages
func (s *clientServer) TreatSignature(ctx context.Context, in *cAPI.Signature) (*pAPI.ErrorCode, error) {
// TODO
return nil, nil
}
// Discover handler
//
// Handle incoming Discover messages
func (s *clientServer) Discover(ctx context.Context, in *cAPI.Hello) (*cAPI.Hello, error) {
fmt.Println("Recieved:", in.Version)
return &cAPI.Hello{Version: dfss.Version}, nil
}
// GetServer create and registers a ClientServer, returning the associted GRPC server
func (m *SignatureManager) GetServer() *grpc.Server {
server := net.NewServer(m.cert, m.key, m.ca)
cAPI.RegisterClientServer(server, &clientServer{})
return server
}
package sign
import (
"crypto/rsa"
"crypto/x509"
"errors"
"fmt"
"strconv"
"dfss"
cAPI "dfss/dfssc/api"
"dfss/dfssc/security"
"dfss/dfssp/api"
pAPI "dfss/dfssp/api"
"dfss/dfssp/contract"
"dfss/net"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
// SignatureManager handles the signature of a contract.
......@@ -17,8 +22,11 @@ type SignatureManager struct {
auth *security.AuthContainer
localPort int
contract *contract.JSON
platform api.PlatformClient
peers map[string]*api.User
platform pAPI.PlatformClient
peers map[string]*cAPI.ClientClient
cServer *grpc.Server
cert, ca *x509.Certificate
key *rsa.PrivateKey
}
// NewSignatureManager populates a SignatureManager and connects to the platform.
......@@ -28,20 +36,23 @@ func NewSignatureManager(fileCA, fileCert, fileKey, addrPort, passphrase string,
localPort: port,
contract: c,
}
ca, cert, key, err := m.auth.LoadFiles()
var err error
m.ca, m.cert, m.key, err = m.auth.LoadFiles()
if err != nil {
return nil, err
}
conn, err := net.Connect(m.auth.AddrPort, cert, key, ca)
m.cServer = m.GetServer()
go func() { _ = net.Listen("0.0.0.0:"+strconv.Itoa(port), m.cServer) }()
conn, err := net.Connect(m.auth.AddrPort, m.cert, m.key, m.ca)
if err != nil {
return nil, err
}
m.platform = api.NewPlatformClient(conn)
m.platform = pAPI.NewPlatformClient(conn)
m.peers = make(map[string]*api.User)
m.peers = make(map[string]*cAPI.ClientClient)
for _, u := range c.Signers {
m.peers[u.Email] = nil
}
......@@ -51,7 +62,7 @@ func NewSignatureManager(fileCA, fileCert, fileKey, addrPort, passphrase string,
// ConnectToPeers tries to fetch the list of users for this contract, and tries to establish a connection to each peer.
func (m *SignatureManager) ConnectToPeers() error {
stream, err := m.platform.JoinSignature(context.Background(), &api.JoinSignatureRequest{
stream, err := m.platform.JoinSignature(context.Background(), &pAPI.JoinSignatureRequest{
ContractUuid: m.contract.UUID,
Port: uint32(m.localPort),
})
......@@ -65,7 +76,7 @@ func (m *SignatureManager) ConnectToPeers() error {
return err
}
errorCode := userConnected.GetErrorCode()
if errorCode.Code != api.ErrorCode_SUCCESS {
if errorCode.Code != pAPI.ErrorCode_SUCCESS {
return errors.New(errorCode.Message)
}
ready, err := m.addPeer(userConnected.User)
......@@ -81,24 +92,36 @@ func (m *SignatureManager) ConnectToPeers() error {
}
// addPeer stores a peer from the platform and tries to establish a connection to this peer.
func (m *SignatureManager) addPeer(user *api.User) (ready bool, err error) {
func (m *SignatureManager) addPeer(user *pAPI.User) (ready bool, err error) {
if user == nil {
err = errors.New("unexpected user format")
return
}
m.peers[user.Email] = user
fmt.Println("Trying to connect with", user.Email, "/", user.Ip+":"+strconv.Itoa(int(user.Port)))
addrPort := user.Ip + ":" + strconv.Itoa(int(user.Port))
fmt.Println("Trying to connect with", user.Email, "/", addrPort)
// TODO do the connection
conn, err := net.Connect(addrPort, m.cert, m.key, m.ca)
if err != nil {
return false, err
}
// Sending Hello message
client := cAPI.NewClientClient(conn)
m.peers[user.Email] = &client
msg, err := client.Discover(context.Background(), &cAPI.Hello{Version: dfss.Version})
if err != nil {
return false, err
}
// Printing answer: application version
fmt.Println("Recieved:", msg.Version)
// Check if we have any other peer to connect to
for _, u := range m.peers {
if u == nil {
return
return false, nil
}
}
ready = true
return
return true, nil
}
all:
protoc --go_out=plugins=grpc:. demonstrator.proto
// Code generated by protoc-gen-go.
// source: demonstrator.proto
// source: dfss/dfssd/api/demonstrator.proto
// DO NOT EDIT!
/*
Package api is a generated protocol buffer package.
It is generated from these files:
demonstrator.proto
dfss/dfssd/api/demonstrator.proto
It has these top-level messages:
Log
......@@ -28,6 +28,10 @@ var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
const _ = proto.ProtoPackageIsVersion1
// Log message to display information
type Log struct {
Timestamp int64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"`
......@@ -124,15 +128,16 @@ var _Demonstrator_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptor0 = []byte{
// 148 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x12, 0x4a, 0x49, 0xcd, 0xcd,
0xcf, 0x2b, 0x2e, 0x29, 0x4a, 0x2c, 0xc9, 0x2f, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62,
0x4e, 0x2c, 0xc8, 0x54, 0xb2, 0xe4, 0x62, 0xf6, 0xc9, 0x4f, 0x17, 0x12, 0xe4, 0xe2, 0x2c, 0xc9,
0xcc, 0x4d, 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0x90, 0x60, 0x54, 0x60, 0xd4, 0x60, 0x16, 0x12, 0xe2,
0xe2, 0xca, 0x4c, 0x49, 0xcd, 0x2b, 0xc9, 0x4c, 0xcb, 0x4c, 0x2d, 0x92, 0x60, 0x02, 0x8a, 0x71,
0x0a, 0x71, 0x73, 0x31, 0xe7, 0xe4, 0xa7, 0x4b, 0x30, 0x83, 0x38, 0x4a, 0xac, 0x5c, 0xcc, 0x8e,
0xc9, 0xd9, 0x46, 0xfa, 0x5c, 0x3c, 0x2e, 0x48, 0x86, 0x0b, 0xc9, 0x73, 0xb1, 0x07, 0xa7, 0xe6,
0xa5, 0x80, 0x4c, 0xe5, 0xd0, 0x03, 0x5a, 0xa1, 0x07, 0x64, 0x49, 0x41, 0x58, 0x40, 0xe5, 0x4a,
0x0c, 0x49, 0x6c, 0x60, 0xeb, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0a, 0xd5, 0xa7, 0xa4,
0x94, 0x00, 0x00, 0x00,
// 167 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x49, 0x2b, 0x2e,
0xd6, 0x07, 0x11, 0x29, 0xfa, 0x89, 0x05, 0x99, 0xfa, 0x29, 0xa9, 0xb9, 0xf9, 0x79, 0xc5, 0x25,
0x45, 0x89, 0x25, 0xf9, 0x45, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xcc, 0x40, 0x71, 0xa5,
0x50, 0x2e, 0x66, 0x9f, 0xfc, 0x74, 0x21, 0x19, 0x2e, 0xce, 0x92, 0xcc, 0xdc, 0xd4, 0xe2, 0x92,
0xc4, 0xdc, 0x02, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xe6, 0x20, 0x84, 0x80, 0x90, 0x1c, 0x17, 0x57,
0x66, 0x4a, 0x6a, 0x5e, 0x49, 0x66, 0x5a, 0x66, 0x6a, 0x91, 0x04, 0x13, 0x50, 0x9a, 0x33, 0x08,
0x49, 0x44, 0x48, 0x80, 0x8b, 0x39, 0x27, 0x3f, 0x5d, 0x82, 0x19, 0x2c, 0x01, 0x62, 0x2a, 0xb1,
0x72, 0x31, 0x3b, 0x26, 0x67, 0x1b, 0xe9, 0x73, 0xf1, 0xb8, 0x20, 0x59, 0x2c, 0x24, 0xcf, 0xc5,
0x1e, 0x9c, 0x9a, 0x97, 0x02, 0xb2, 0x91, 0x43, 0x0f, 0x68, 0xbd, 0x1e, 0x90, 0x25, 0x05, 0x61,
0x01, 0x95, 0x2b, 0x31, 0x24, 0xb1, 0x81, 0x9d, 0x66, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xc3,
0xc3, 0x86, 0x7b, 0xbf, 0x00, 0x00, 0x00,
}
all:
protoc --go_out=plugins=grpc:. gRPCServices.proto
// Code generated by protoc-gen-go.
// source: gRPCServices.proto
// source: dfss/dfssp/api/platform.proto
// DO NOT EDIT!
/*
Package api is a generated protocol buffer package.
It is generated from these files:
gRPCServices.proto
dfss/dfssp/api/platform.proto
It has these top-level messages:
RegisterRequest
......@@ -471,44 +471,44 @@ var _Platform_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptor0 = []byte{
// 618 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x54, 0x5f, 0x6f, 0xd3, 0x3e,
0x14, 0x6d, 0xd2, 0xec, 0x4f, 0xee, 0xd6, 0x2e, 0x72, 0xf7, 0xfb, 0x29, 0x54, 0x02, 0x4d, 0x16,
0x12, 0x08, 0xa1, 0x32, 0x15, 0x09, 0x09, 0xde, 0xb2, 0x50, 0x6d, 0x43, 0xa8, 0x9a, 0xdc, 0x15,
0x24, 0xde, 0x42, 0xea, 0xb5, 0xd1, 0x9a, 0xa4, 0x38, 0x0e, 0x68, 0x4f, 0xf0, 0x49, 0xf8, 0x5a,
0x7c, 0x1c, 0xb0, 0x9d, 0x38, 0x4d, 0x4a, 0x85, 0xb4, 0x3e, 0xb4, 0x3e, 0xd7, 0xd7, 0xe7, 0xf8,
0x9e, 0x7b, 0x5d, 0x40, 0x73, 0x72, 0xe5, 0x4f, 0x28, 0xfb, 0x1a, 0x85, 0x34, 0x1b, 0xac, 0x58,
0xca, 0x53, 0xd4, 0x0e, 0x56, 0x11, 0xf6, 0xe0, 0x88, 0xd0, 0x79, 0x94, 0x71, 0xca, 0x08, 0xfd,
0x92, 0xd3, 0x8c, 0xa3, 0x63, 0xd8, 0xa1, 0x71, 0x10, 0x2d, 0x5d, 0xe3, 0xc4, 0x78, 0x6a, 0x93,
0x02, 0x20, 0x17, 0xf6, 0x58, 0x91, 0xe0, 0x9a, 0x2a, 0xae, 0x21, 0xfe, 0x69, 0x80, 0x3d, 0x62,
0x2c, 0x65, 0x7e, 0x3a, 0xa3, 0xe8, 0x09, 0x58, 0xa1, 0xf8, 0x55, 0x87, 0xbb, 0xc3, 0xde, 0x40,
0x88, 0x0c, 0xaa, 0xdd, 0x81, 0xfc, 0x22, 0x2a, 0x41, 0x12, 0xc6, 0x34, 0xcb, 0x82, 0x39, 0xd5,
0x84, 0x25, 0xc4, 0x63, 0xb0, 0x14, 0xd5, 0x01, 0xec, 0x4d, 0xa6, 0xbe, 0x3f, 0x9a, 0x4c, 0x9c,
0x16, 0x02, 0xd8, 0xbd, 0x1c, 0x7f, 0xf0, 0xc8, 0xb9, 0x63, 0xc8, 0x8d, 0x33, 0xef, 0xad, 0x37,
0xbd, 0xbe, 0x70, 0x4c, 0x09, 0x3e, 0x7a, 0x64, 0x7c, 0x39, 0x3e, 0x77, 0xda, 0xa8, 0x27, 0xb3,
0xae, 0x47, 0x84, 0x38, 0xbf, 0xf5, 0xc7, 0xc0, 0xaf, 0xe1, 0xc0, 0xcb, 0xf9, 0xe2, 0xdf, 0xf5,
0x89, 0x28, 0x4f, 0x6f, 0x69, 0x52, 0x5e, 0xa6, 0x00, 0xf8, 0x14, 0xba, 0xda, 0x1e, 0x3a, 0x9b,
0x66, 0x94, 0xa1, 0x47, 0x00, 0xe1, 0x32, 0xa2, 0x09, 0xf7, 0x29, 0xe3, 0x25, 0x45, 0x2d, 0x82,
0xf7, 0x60, 0x67, 0x14, 0xaf, 0xf8, 0x1d, 0xfe, 0x06, 0xbd, 0xab, 0x34, 0xe3, 0x7e, 0x9a, 0x70,
0x16, 0x84, 0x5c, 0xab, 0x23, 0xb0, 0x16, 0x41, 0xb6, 0x50, 0x27, 0x0f, 0x89, 0x5a, 0xa3, 0x3e,
0xec, 0xdf, 0x44, 0x4b, 0x9a, 0x04, 0xb1, 0xf6, 0xa2, 0xc2, 0xe8, 0x7f, 0xd8, 0xcd, 0xa2, 0x79,
0x42, 0x99, 0xdb, 0x3e, 0x69, 0x8b, 0x9d, 0x12, 0x49, 0xfb, 0xc2, 0x34, 0x8e, 0x85, 0xac, 0x6b,
0x15, 0xf6, 0x95, 0x50, 0xd8, 0x77, 0xfc, 0x2e, 0x8d, 0x92, 0x89, 0xc8, 0x0b, 0x78, 0xce, 0xa8,
0x56, 0xc6, 0x70, 0x18, 0x96, 0x97, 0x99, 0xe6, 0xd1, 0xac, 0xbc, 0x7b, 0x23, 0x26, 0x6f, 0xb7,
0x4a, 0x59, 0xd1, 0xe2, 0x0e, 0x51, 0x6b, 0xfc, 0xc3, 0x80, 0x8e, 0x2c, 0x5d, 0x54, 0x92, 0xd0,
0x90, 0xd3, 0x19, 0x7a, 0x0e, 0x36, 0xd5, 0x2d, 0x55, 0x34, 0x07, 0xc3, 0x6e, 0xb3, 0xd1, 0x64,
0x9d, 0xf0, 0x97, 0xae, 0xb9, 0x45, 0xf7, 0x21, 0x58, 0x79, 0xa6, 0x6a, 0x94, 0x64, 0xb6, 0x22,
0x93, 0x9a, 0x44, 0x85, 0xf1, 0x27, 0xb0, 0x94, 0xf9, 0xa2, 0xe8, 0x5b, 0x7a, 0x77, 0xb1, 0xf6,
0x4f, 0xc3, 0x75, 0x53, 0xcd, 0x7a, 0x53, 0xbb, 0x60, 0x46, 0x2b, 0x45, 0x6a, 0x13, 0xb1, 0xaa,
0xca, 0xb3, 0x6a, 0xe5, 0xbd, 0x02, 0x87, 0xd0, 0x60, 0x76, 0x27, 0xfd, 0xba, 0x87, 0x55, 0xf8,
0x3b, 0x1c, 0xbd, 0x0f, 0xf2, 0x24, 0x5c, 0x54, 0x46, 0xdf, 0xd3, 0x97, 0xc7, 0xd0, 0xc9, 0xf4,
0xd1, 0x9a, 0x31, 0xcd, 0x60, 0xbd, 0xe4, 0x62, 0x00, 0x34, 0x1c, 0xfe, 0x32, 0x61, 0xff, 0x6a,
0x19, 0xf0, 0x9b, 0x94, 0xc5, 0x68, 0x08, 0xfb, 0x7a, 0x50, 0xd1, 0xb1, 0xd2, 0xdc, 0x78, 0xd6,
0xfd, 0x8d, 0x9b, 0xe0, 0x16, 0x7a, 0x01, 0x96, 0x7c, 0x17, 0xc8, 0x51, 0x3b, 0xb5, 0x27, 0xd2,
0xef, 0x35, 0x18, 0x8a, 0xc9, 0x17, 0x07, 0x9e, 0x01, 0x4c, 0x13, 0xa6, 0x65, 0xa0, 0x20, 0x94,
0xc3, 0xbe, 0x85, 0xfc, 0x0d, 0x1c, 0xd6, 0xc7, 0x1f, 0xb9, 0x2a, 0x63, 0xcb, 0x8b, 0xd8, 0x72,
0xf6, 0x0c, 0x3a, 0x8d, 0x09, 0x46, 0x0f, 0x54, 0xca, 0xb6, 0xa9, 0xee, 0xa3, 0x6a, 0x56, 0xaa,
0xf9, 0xc4, 0xad, 0x53, 0x43, 0xe8, 0xdb, 0x55, 0x5b, 0xd1, 0x7f, 0x65, 0x3d, 0xcd, 0x36, 0xf7,
0x0b, 0xa3, 0x36, 0xba, 0x88, 0x5b, 0x9f, 0x77, 0xd5, 0x1f, 0xe4, 0xcb, 0x3f, 0x01, 0x00, 0x00,
0xff, 0xff, 0xff, 0xc7, 0x56, 0xf4, 0x36, 0x05, 0x00, 0x00,
// 621 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x54, 0x5d, 0x6f, 0xd3, 0x30,
0x14, 0x6d, 0xda, 0xec, 0xa3, 0x77, 0x6b, 0x17, 0xb9, 0x03, 0x95, 0x4a, 0x43, 0x93, 0x85, 0x04,
0x42, 0xa8, 0x9d, 0x8a, 0x84, 0x04, 0x6f, 0x59, 0xa9, 0xb6, 0x21, 0x54, 0x4d, 0xee, 0x0a, 0x12,
0x6f, 0x21, 0xf1, 0xd6, 0x68, 0xcd, 0x07, 0xb6, 0x23, 0xb4, 0x27, 0xf8, 0x25, 0xfc, 0x2d, 0x7e,
0x0e, 0xd8, 0x4e, 0x9c, 0x25, 0xa5, 0x42, 0xda, 0x1e, 0x32, 0x9f, 0xeb, 0xeb, 0x73, 0x7c, 0xcf,
0xbd, 0x2e, 0x1c, 0x05, 0xd7, 0x9c, 0x8f, 0xd4, 0x27, 0x1d, 0x79, 0x69, 0x38, 0x4a, 0x57, 0x9e,
0xb8, 0x4e, 0x58, 0x34, 0x4c, 0x59, 0x22, 0x12, 0xd4, 0x92, 0x31, 0xec, 0xc2, 0x01, 0xa1, 0x37,
0x21, 0x17, 0x94, 0x11, 0xfa, 0x2d, 0xa3, 0x5c, 0xa0, 0x43, 0xd8, 0xa2, 0x91, 0x17, 0xae, 0xfa,
0xd6, 0xb1, 0xf5, 0xa2, 0x4d, 0x72, 0x80, 0xfa, 0xb0, 0xc3, 0xf2, 0x84, 0x7e, 0x53, 0xc7, 0x0d,
0xc4, 0xbf, 0x2c, 0x68, 0x4f, 0x19, 0x4b, 0xd8, 0x24, 0x09, 0x28, 0x7a, 0x0e, 0xb6, 0x2f, 0xff,
0xeb, 0xc3, 0xdd, 0x71, 0x6f, 0x28, 0x45, 0x86, 0xe5, 0xee, 0x50, 0x7d, 0x88, 0x4e, 0x50, 0x84,
0x11, 0xe5, 0xdc, 0xbb, 0xa1, 0x86, 0xb0, 0x80, 0x78, 0x06, 0xb6, 0xa6, 0xda, 0x83, 0x9d, 0xf9,
0x62, 0x32, 0x99, 0xce, 0xe7, 0x4e, 0x03, 0x01, 0x6c, 0x5f, 0xcc, 0x3e, 0xb9, 0xe4, 0xcc, 0xb1,
0xd4, 0xc6, 0xa9, 0xfb, 0xde, 0x5d, 0x5c, 0x9d, 0x3b, 0x4d, 0x05, 0x3e, 0xbb, 0x64, 0x76, 0x31,
0x3b, 0x73, 0x5a, 0xa8, 0xa7, 0xb2, 0xae, 0xa6, 0x84, 0x38, 0x7f, 0xcc, 0x9f, 0x85, 0xdf, 0xc2,
0x9e, 0x9b, 0x89, 0xe5, 0xff, 0xeb, 0x93, 0x51, 0x91, 0xdc, 0xd2, 0xb8, 0xb8, 0x4c, 0x0e, 0xf0,
0x09, 0x74, 0x8d, 0x3d, 0x34, 0x58, 0x70, 0xca, 0xd0, 0x53, 0x00, 0x7f, 0x15, 0xd2, 0x58, 0x4c,
0x28, 0x13, 0x05, 0x45, 0x25, 0x82, 0x77, 0x60, 0x6b, 0x1a, 0xa5, 0xe2, 0x0e, 0x7f, 0x87, 0xde,
0x65, 0xc2, 0xc5, 0x24, 0x89, 0x05, 0xf3, 0x7c, 0x61, 0xd4, 0x11, 0xd8, 0x4b, 0x8f, 0x2f, 0xf5,
0xc9, 0x7d, 0xa2, 0xd7, 0x68, 0x00, 0xbb, 0xd7, 0xe1, 0x8a, 0xc6, 0x5e, 0x64, 0xbc, 0x28, 0x31,
0x7a, 0x0c, 0xdb, 0x3c, 0xbc, 0x89, 0x29, 0xeb, 0xb7, 0x8e, 0x5b, 0x72, 0xa7, 0x40, 0xca, 0x3e,
0x3f, 0x89, 0x22, 0x29, 0xdb, 0xb7, 0x73, 0xfb, 0x0a, 0x28, 0xed, 0x3b, 0xfc, 0x90, 0x84, 0xf1,
0x5c, 0xe6, 0x79, 0x22, 0x63, 0xd4, 0x28, 0x63, 0xd8, 0xf7, 0x8b, 0xcb, 0x2c, 0xb2, 0x30, 0x28,
0xee, 0x5e, 0x8b, 0xa9, 0xdb, 0xa5, 0x09, 0xcb, 0x5b, 0xdc, 0x21, 0x7a, 0x8d, 0x7f, 0x5a, 0xd0,
0x51, 0xa5, 0xcb, 0x4a, 0x62, 0xea, 0x0b, 0x1a, 0xa0, 0x57, 0xd0, 0xa6, 0xa6, 0xa5, 0x9a, 0x66,
0x6f, 0xdc, 0xad, 0x37, 0x9a, 0xdc, 0x27, 0xfc, 0xa3, 0xdb, 0xdc, 0xa0, 0x7b, 0x04, 0x76, 0xc6,
0x75, 0x8d, 0x8a, 0xac, 0xad, 0xc9, 0x94, 0x26, 0xd1, 0x61, 0xfc, 0x05, 0x6c, 0x6d, 0xbe, 0x2c,
0xfa, 0x96, 0xde, 0x9d, 0xdf, 0xfb, 0x67, 0xe0, 0x7d, 0x53, 0x9b, 0xd5, 0xa6, 0x76, 0xa1, 0x19,
0xa6, 0x9a, 0xb4, 0x4d, 0xe4, 0xaa, 0x2c, 0xcf, 0xae, 0x94, 0xf7, 0x06, 0x1c, 0x42, 0xbd, 0xe0,
0x4e, 0xf9, 0xf5, 0x00, 0xab, 0xf0, 0x0f, 0x38, 0xf8, 0xe8, 0x65, 0xb1, 0xbf, 0x2c, 0x8d, 0x7e,
0xa0, 0x2f, 0xcf, 0xa0, 0xc3, 0xcd, 0xd1, 0x8a, 0x31, 0xf5, 0x60, 0xb5, 0xe4, 0x7c, 0x00, 0x0c,
0x1c, 0xff, 0x6e, 0xc2, 0xee, 0x65, 0xf1, 0xa4, 0xd1, 0x18, 0x76, 0xcd, 0xa0, 0xa2, 0x43, 0xad,
0xb9, 0xf6, 0xac, 0x07, 0x6b, 0x37, 0xc1, 0x0d, 0x34, 0x02, 0x5b, 0xbd, 0x0b, 0xe4, 0xe8, 0x9d,
0xca, 0x13, 0x19, 0xf4, 0x6a, 0x0c, 0xf9, 0xe4, 0xcb, 0x03, 0x2f, 0x01, 0x16, 0x31, 0x33, 0x32,
0x90, 0x13, 0xaa, 0x61, 0xdf, 0x40, 0xfe, 0x0e, 0xf6, 0xab, 0xe3, 0x8f, 0xfa, 0x3a, 0x63, 0xc3,
0x8b, 0xd8, 0x70, 0xf6, 0x14, 0x3a, 0xb5, 0x09, 0x46, 0x4f, 0x74, 0xca, 0xa6, 0xa9, 0x1e, 0xa0,
0x72, 0x56, 0xca, 0xf9, 0xc4, 0x8d, 0x13, 0x4b, 0xea, 0xb7, 0xcb, 0xb6, 0xa2, 0x47, 0x45, 0x3d,
0xf5, 0x36, 0x0f, 0x72, 0xa3, 0xd6, 0xba, 0x88, 0x1b, 0x5f, 0xb7, 0xf5, 0x0f, 0xe4, 0xeb, 0xbf,
0x01, 0x00, 0x00, 0xff, 0xff, 0xa1, 0x73, 0x51, 0x2e, 0x41, 0x05, 0x00, 0x00,
}
......@@ -83,6 +83,7 @@ message User {
string ip = 3;
uint32 port = 4;
}
// ReadySignRequest contains the contract unique identitier that is ready to be signed
message ReadySignRequest {
string contractUuid = 1;
......