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.