diff --git a/ct/rubicon.aes b/ct/rubicon.aes index e253e65..b57bf2c 100644 --- a/ct/rubicon.aes +++ b/ct/rubicon.aes @@ -1,17 +1,44 @@ /** - * Rubicon contracts - * - * Copyright (C) 2026, QPQ AG + * Rubicon contract * * Author: Peter Harpending * Date: 2026-08-12 */ -payable contract NameService = - record state = - {names : map(string, address)} +contract Rubicon = + // this could/should be a record, but records aren't really + // portable across contracts/languages/APIs + // + // I think records are returned to caller as a FATE tuple with + // fields in this order. I don't really know though and that's + // kind of a hack and not something that we should build around i + // feel like + // + // record rbx = + // {ip : string, + // port : int, + // protocol : string, // "tcp", "udp", "sctp", etc + // noise : string, // Noise_Foo_Bar_Baz_Quux + // pubkey : bytes, // service's pubkey + // salt : bytes} // ??? - payable entrypoint - init : () => state - init() = - + // (ip, port, protocol, noise, pubkey) + type rbx_tuple = string * int * string * string * bytes + type state = list(rbx_tuple) + + entrypoint + init : list(rbx_tuple) => state + init(services) = + services + + stateful entrypoint + set_services : list(rbx_tuple) => () + set_services(_) | Call.caller != Contract.creator = + abort("Not allowed") + set_services(svs) = + put(svs) + + entrypoint + get_services : () => list(rbx_tuple) + get_services() = + state