Maxim Sokhatsky
Live
EXE
Synrc Research Center
       intro system overview
     prelude foundations
intermission business
        coda banking
TOC
Intro
Verified Concise
Distributed Performant Unikernel
unikernel system overview verified foundations concise business distributed transactions performant erlang
Features
Unikernel
Coq CoInductive Structures, Type Classes Agda Type Classes, CoInductive Structures Lean Polymorphic Stuctures, Type Classes Idris Type Classes F* Type Classes
Verified
Concise
MAD 1K
FS 190
ACT 175
VZ 200
N2O 1.2K KVS 1.2K SHEN 220 NITRO 2.6K MQS 288
BPE 625 FORMS 290 UPL 6K LDAP 730 XA 2.2K
Voxoz  Synrc   Spawnproc
Distributed
PAXOS/RAFT latency
        CR traffic/linearizations
Goal: provable distributed algorithm
      of transactional processing
Amazon Europe
Performant
Prelude Foundations KVS N2O BPE
Semigroup Action
record app (P S : Type) :=
       (action  : P → S → E S)
       (spawn   : P → S)
       (run     : S → P)
action — effect handler
     P — protocol
     S — state
Types and Effects
exception : rise
       io : read, write
    state : get, put
     comm : send, recv
      rnd : next
(action : P → Eff P )
Inductive Records
definition ids       := option N
    record container := (top: ids) (size: N)
    record iterator  := (id: ids)
                        (next: ids)
                        (prev: ids) 
KVS
Abstract Term Database
> mnesia:activity(transaction, fun() ->
     kvs:append(#user{id=
     kvs:next_id("user",1)}) end).
[{get,container,_},
 {get,top,_},
 {put,iterator,_},
 {put,prev,_},
 {put,next,_},
 {put,container,_}].
Atomic
Versioning
> kvs:config(user).
[#in{l=902, r=infinity, name=user6, last=user2},
 #in{l=704, r=901,      name=user5, last=user2},
 #in{l=502, r=703,      name=user4, last=user2},
 #in{l=301, r=501,      name=user3, last=user},
 #in{l=200, r=300,      name=user2, last=user},
 #in{l=1,   r=199,      name=user,  last=user}]
N2O
Protocol Multiplicator
N2O Stack
#deposit_app
#otp
25 Forms/Month
Ontological Model
Schema/Keys
Table/Record
Document/Forms
Validation/Fields
HTML
Protocols
Remote Protocol
BPE
BPMN 2.0 process management
BPMN 2.0
Definition
    action({request,'AcquirePhone'}, Proc) ->
        Phone = bpe:doc(#phone{},Proc),
        io:format("ACT Deposit Phone: ~p~n",[Phone]),
        bpe:val(Phone,Proc,fun valid/2);
    action({request,'CheckOTP'}, Proc) ->
        OTP = bpe:doc(#otp{},Proc),
        io:format("ACT Deposit OTP: ~p~n",[OTP]),
        bpe:val(OTP,Proc,fun valid/2);
    action({event,'Payment',Payment}, Proc) ->
        io:format("ACT Deposit Payment~p~n",[Payment]),
        bpe:val(Payment,Proc,fun valid/2);
    action({request,'CreateAccount'}, Proc) ->
        DepositApp=bpe:doc(#deposit_app{},Proc),
        bpe:val(DepositApp,Proc,fun valid/2,fun(Form,Proc) ->
            io:format("KVS Deposit Forms Store   ~p ~n",[Form]),
            kvs:add(Form),
            Account = #account{program=Form#deposit_app.program,type=deposit},
            io:format("ACT Deposit Create Account ~p ~n",[Account]) end);deposit.erl
Actions
Intermission Business Applications Deposits Processing
  program Deposit_Plus UAH
  include 'PB-CASHBACK.card'
  version 1
  deposit duration range monthly 1 -> 20%
                       monthly 3 -> 22%
                       monthly 6 -> 22%
                       annual 23%
           withdraw disabled
           auto
           charge enabled monthly limit max 20000
           monthly 1% of amount to account '/users/:client/bonus'
           recalculate move from rate to deposit
           monthly 15% name 'tax' of deposit to account 'users/:client/tax'
  accounts deposit 'users/:client/deposit'
           rate 'users/:client/rate'Processing
ACT
#phone
#otp
#application
#termination
#transfer
#charge
#withdraw
#client
#payment
BPE
#process #sequenceFlow #messageEvent #task #serviceTask #receiveTask #userTask #beginEvent #endEvent #history
DBS
#account
#customer
#program
#card
#transaction
#cashback
#currency
TPS
#prepare #commit #rollback
UPL
XA
KVS
#iterator
#container
#subscription
#user
#client
#config
N2O
#element #action #ev #cx
Coda Deposits Moneybox Services
Deposits
Processes: 7      13      18
    Forms: 32     61      101
   Panels: 2      7       16
Endpoints: 0      8       14
 Services: 0      20/30   26/60
12/14  06/15   12/15
Moneybox
Processes: 0
    Forms: 22
   Panels: 3
Endpoints: 4
12/15
Performance
Pipeline Basic
 Services Bank 8KLOC/800KB
Pipeline Basic 4.7KLOC/340KB
#otp #ivr #insider #ekb #grantset #error #promin #iq #timing #p24 #wf #doc #validation #cxp #crm #payment #antifraud #corezoid
PB
host(_) -> "https://services.privatbank.ua"; ato() -> {{?MODULE,pb:host(?MODULE)}, [{1,xml,post,?MODULE,{req1,ans1},2, "/api/deposits/backend"}]}. req1([EkbID,Bank],Acc) -> {ok,pb:xml([]),Acc}.
ans1(XML,Acc) -> {ok,[],Acc}.
PB
BPE = List JSON = Binary ACKS = Eff Data Eff Data = {error,Data,NewAcc} | {warning,Data,NewAcc} | {erorrCode,Data,NewAcc} | {ok,Data,NewAcc} req BPE -> JSON call JSON -> ACKS ans ACKS -> BPE
PB
> pb:service(pb_otp:send(),[#phone{number="1"},#otp{code="1"}],1000,[]). =INFO REPORT==== 12-Oct-2015::04:40:50 === pb:MOCK "text/xml" post "https://sms-inner.siteheart.com/api/otp_create_api.cgi" {ok,true, [{ans1,<<"<?xml">>>}, {call,<<"<?xml">>}, {req1,[#phone{},#otp{}]}
PB
pipe(Params) -> req9 call ans9  
                req8 call ans8 
                req7 call ans7 $ Params.
    {ok,20,
     [{ans2,20},
      {call,<<"{"O">>},
      {req2,<<"{"O"">>},
      {ans1,[[],[],1,<<"00000001">>,site]},
      {call,<<"OpenResponse">>},
      {req1,<<"OpenRequest">>},
      {req,<<"OpenRequest">>},
      {id,<<"00000001">>},
      {sid,1},
      {channel,site}]}
By Maxim Sokhatsky
This talk is about SpawnProc Intermediary Processing Language UPL and Core Services BPE, DBS and FORMS.