[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-talk
Subject:    michelson library / gem - test simulator / runtime for type-safe 'n' functional (crypto) contracts (
From:       Gerald Bauer <gerald.bauer () gmail ! com>
Date:       2019-04-09 14:45:37
Message-ID: CAAxEZd_ue8_1Me9J=J+wt64J1pzuBvduk7uBAr-+m6b6x0BQPg () mail ! gmail ! com
[Download RAW message or body]

Hello,

  I've put together michelson [1] - a test simulator and runtime library / gem
that lets you write and run type-safe 'n' functional (crypto)
contracts in yes, it's just ruby.

   See the Let's Count [2] or the Let's Vote [3] examples to get started
with functional type-safe Liquidity (OCaml/ReasonML)-style programming in ruby.

```
######################################
#  Let's Count - 0, 1, 2, 3
type :Storage, Integer

init [],
def storage()
  0
end

entry [Integer],
def inc( by, storage )
  [[], storage + by]
end

################################
## Test, Test, Test

storage  = storage()
# => calling storage()...
# => returning:
# => 0
_, storage = inc( 2, storage )
# => calling inc( 2, 0 )...
# => returning:
# => [[], 2]
_, storage = inc( 1, storage )
# => calling inc( 1, 2 )...
# => returning:
# => [[], 3]
```

  or

```
type :Storage, Map‹String→Integer›

init [],
def storage()
  {"ocaml" => 0, "reason" => 0, "ruby" => 0}
end

entry [String],
def vote( choice, votes )
  amount = Current.amount
  if amount < 5.tz
    Current.failwith( "Not enough money, at least 5tz to vote" )
  else
    match Map.find(choice, votes), {
     None: ->()  { Current.failwith( "Bad vote" ) },
     Some: ->(x) { votes = Map.add(choice, x + 1, votes); [[], votes] }}
  end
end


storage  = storage()
#=> calling storage()...
#=> returning:
#=> {"ocaml"=>0, "reason"=>0, "ruby"=>0}
# _, storage = vote( "ruby", storage )
#=> calling vote( "ruby", {"ocaml"=>0, "reason"=>0, "ruby"=>0} )...
#=> RuntimeError: failwith - Not enough money, at least 5tz to vote

Current.amount = 10.tz

storage  = storage()
#=> calling storage()...
#=> returning:
#=> {"ocaml"=>0, "reason"=>0, "ruby"=>0}
_, storage = vote( "ruby", storage )
#=> calling vote( "ruby", {"ocaml"=>0, "reason"=>0, "ruby"=>0} )...
#=> returning:
#=> [[], {"ocaml"=>0, "reason"=>0, "ruby"=>1}]
_, storage = vote( "reason", storage )
#=> calling vote( "reason", {"ocaml"=>0, "reason"=>0, "ruby"=>1} )...
#=> returning:
#=> [[], {"ocaml"=>0, "reason"=>1, "ruby"=>1}]
_, storage = vote( "python", storage )
#=> calling vote( "python", {"ocaml"=>0, "reason"=>1, "ruby"=>1} )...
#=> RuntimeError: failwith - Bad vote
```


   Happy (crypto) contract programming with (secure) ruby. Cheers. Prost.

[1] https://github.com/s6ruby/ruby-to-michelson/tree/master/michelson
[2] https://github.com/s6ruby/ruby-to-michelson/blob/master/contracts/counter.rb
[3] https://github.com/s6ruby/ruby-to-michelson/blob/master/contracts/vote.rb

Unsubscribe: <mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk>

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic