Remove half-completed ballet application.

This commit is contained in:
Elliot Glaysher 2019-06-21 14:45:44 -07:00
parent 7ebec10a56
commit 59387055f9
2 changed files with 0 additions and 349 deletions

View File

@ -1,269 +0,0 @@
/- *ballet, *ring
/+ tapp, stdio, *ring
::
:: Preamble
::
=>
|%
+$ state
$: next-election-num=@u
open-elections=(map id election)
closed-elections=(map id election)
==
+$ peek-data _!!
+$ in-poke-data
$% :: casts a ballot
::
[%ballot-cast =id =ring-signature =vote]
:: creates a new election
::
[%ballot-create =electorate =ballot closes=@da]
==
+$ out-poke-data
~
+$ in-peer-data
~
+$ out-peer-data
:: For observers, our wire interface is:
::
:: /[election-num] <- subscribes to the results of a specific election
::
election-diff
++ tapp (^tapp state peek-data in-poke-data out-poke-data in-peer-data out-peer-data)
++ stdio (^stdio out-poke-data out-peer-data)
--
=>
|%
:: validates that all answers are valid to the selected questions
::
++ valid-vote
|= [questions=(list question) =vote]
^- ?
::
?: &(=(~ questions) =(~ answers.vote))
%.y
::
?~ questions
%.n
?~ answers.vote
%.n
::
=/ current-valid=?
?- -.i.answers.vote
%check
?& ?=(%check -.i.questions)
::
=/ len (lent descriptions.i.questions)
(levy checked.i.answers.vote |=(a=@u (lth a len)))
==
::
%radio
?& ?=(%radio -.i.questions)
(lth checked.i.answers.vote (lent descriptions.i.questions))
==
==
::
?: =(%.n current-valid)
%.n
::
$(questions t.questions, answers.vote t.answers.vote)
:: adds the :vote to the running :tally
::
++ update-tally
|= [=tally =vote]
^+ tally
::
?~ tally
~
?~ answers.vote
tally
::
:_ $(tally t.tally, answers.vote t.answers.vote)
::
=/ answers=(list @u)
?- -.i.answers.vote
%check checked.i.answers.vote
%radio [checked.i.answers.vote ~]
==
::
|-
?~ answers
i.tally
::
=. i.tally
%+ ~(put by i.tally) i.answers
::
?~ previous-tally=(~(get by i.tally) i.answers)
1
+(u.previous-tally)
::
$(answers t.answers)
--
=, async=async:tapp
=, tapp-async=tapp-async:tapp
=, stdio
::
:: The app
::
%- create-tapp-poke-peer:tapp
^- tapp-core-poke-peer:tapp
|_ [=bowl:gall =state]
::
:: Main function
::
++ handle-poke
|= =in-poke-data
=/ m tapp-async
^- form:m
::
?- -.in-poke-data
::
%ballot-cast
~& %ballot-cast
:: verify ballot is for a valid election
::
?~ election=(~(get by open-elections.state) id.in-poke-data)
~& [%invalid-election id.in-poke-data]
(pure:m state)
:: verify ballot has a valid signature
::
=/ electorate-keys=(set @udpoint)
(~(run in electorate.u.election) public-key-for-ship)
::
?. %- verify :*
vote.in-poke-data
[~ [%election id.in-poke-data]]
electorate-keys
ring-signature.in-poke-data
==
~& [%invalid-signature ~]
(pure:m state)
:: the signature must have a ring tag
::
?: ?=(~ y.ring-signature.in-poke-data)
~& [%missing-ring-tag ~]
(pure:m state)
:: is this person trying to vote twice?
::
?: (~(has by cast.u.election) u.y.ring-signature.in-poke-data)
~& [%attempting-to-vote-twice u.y.ring-signature.in-poke-data]
(pure:m state)
:: is this a valid ballot?
::
?. (valid-vote questions.ballot.u.election vote.in-poke-data)
~& [%invalid-ballot u.y.ring-signature.in-poke-data]
(pure:m state)
:: we have a valid vote. make it part of our state.
::
=. open-elections.state
%+ ~(jab by open-elections.state) id.in-poke-data
|= =^election
~& [%recording-vote-by u.y.ring-signature.in-poke-data vote.in-poke-data]
%_ election
cast
%+ ~(put by cast.election) u.y.ring-signature.in-poke-data
[ring-signature.in-poke-data vote.in-poke-data]
::
tally
(update-tally tally.election vote.in-poke-data)
==
::
=/ election-path=path /(scot %u election-num.id.in-poke-data)
:: broadcast this valid vote to the world
::
;< ~ bind:m
=, in-poke-data
(give-result election-path `election-diff`[%vote ring-signature vote])
::
=/ =^election (~(got by open-elections.state) id.in-poke-data)
:: if everyone has voted, this election is over.
::
?: =(~(wyt in electorate.election) ~(wyt by cast.election))
:: todo: trying to separate this into its own helper function nest-fails
:: at the |_ state?
::
:: notify everyone that the election is over.
::
;< ~ bind:m
(give-result election-path [%election-completed ~])
~& [%election-closed id.in-poke-data]
:: todo: can't quit a wire in the current stdio?
::
:: move the election state from open to closed
::
=/ election
(~(got by open-elections.state) id.in-poke-data)
~& [%election-results tally.election]
=. open-elections.state
(~(del by open-elections.state) id.in-poke-data)
=. closed-elections.state
(~(put by closed-elections.state) id.in-poke-data election)
::
(pure:m state)
::
(pure:m state)
::
%ballot-create
=/ election-num next-election-num.state
=/ =id [our.bowl election-num]
::
=. next-election-num.state +(next-election-num.state)
=. open-elections.state
%+ ~(put by open-elections.state) id
^- election
:* id
electorate.in-poke-data
ballot.in-poke-data
closes.in-poke-data
cast=~
tally=(reap (lent questions.ballot.in-poke-data) ~)
==
::
~& [%created-new-ballot id electorate.in-poke-data]
:: todo: figure out how to set a timer so we can close an election on a
:: timer.
::
(pure:m state)
==
::
++ handle-peer
|= =path
=/ m tapp-async
^- form:m
~& [%tapp-fetch-take-peer path]
::
?. ?=([@ ~] path)
~& [%bad-path path]
(pure:m state)
::
?~ election-id=(slaw %ud i.path)
~& [%unparsable-election-id i.path]
(pure:m state)
::
?^ election=(~(get by open-elections.state) u.election-id)
:: send the current state of the election as the opening statement
::
;< ~ bind:m
(give-result path [%snapshot u.election])
::
(pure:m state)
::
?^ election=(~(get by closed-elections.state) u.election-id)
:: send the completed election
::
;< ~ bind:m
(give-result path [%snapshot u.election])
:: send the election completed message
::
;< ~ bind:m
(give-result path [%election-completed ~])
::
:: todo: also close the path.
::
(pure:m state)
::
~& [%invalid-electin-id u.election-id]
:: todo: close the invalid subscription
::
(pure:m state)
--

View File

@ -1,80 +0,0 @@
/- ring
:: /sour/ballot
::
|%
:: The electorate is the set of people who may vote in an election. This is
:: set during the creation of the election
::
++ electorate
(set @p)
:: The ballot is the set of questions which are then voted on.
::
++ ballot
$: preamble=tape
questions=(list question)
==
:: A question is either a select as many as you want %check or select one %radio
::
++ question
$% [%check preamble=tape descriptions=(list tape)]
[%radio preamble=tape descriptions=(list tape)]
==
:: An individual answer to a question
::
++ answer
$% [%check checked=(list @u)]
[%radio checked=@u]
==
:: A vote is a list of answers to questions on a ballot
::
:: We include the id in this structure because the vote is what gets signed
:: and I'm paranoid about replay attacks.
::
+$ vote
[=id answers=(list answer)]
:: A unique id which is used as linkage scope on signatures to votes
::
++ id
$: host=@p
election-num=@u
==
:: A running count of the state of the election
::
+$ tally
(list (map index=@u count=@u))
:: +election contains all the state of an election, and is releasable during
:: and after the fact
::
++ election
$: :: a unique id for this election
::
=id
:: who may vote
::
=electorate
:: what is being voted on
::
=ballot
:: when the election closes
::
closes=@da
:: cast votes, sorted on linkage tag
::
:: A ring tag is the :y point in a ring-signature, and is unique for
:: every pair of private key/election id.
::
cast=(map @udpoint [=ring-signature:ring =vote])
:: the current running tally of the results
::
=tally
==
:: +election-diff: a series of events which rebuilds an +election object
::
++ election-diff
$% [%snapshot =election]
[%vote =ring-signature:ring =vote]
[%election-completed ~]
==
--