[
"autonomous agent",
{
"messages": {
"cases": [
{
"if": "{
// Obotic / MicroGrid by
[email protected]
// My best entry, combines techniques from all my previous AA, structure based on REDvsBLUE
// 1) Scientist send args to be processed by obots
$project = "
HFLVDJOZ3ZF2UR2ZQU4IOJRCPTC5DLZT" ; // Select Random Registered Address AA
$min_poolsize = 1 ; // use 1 for demo
$processors_per_round = 3 ; // limited by The total number of secondary AAs stemming from a single primary AA cannot exceed 10, otherwise the primary AA fails and bounces. Takes ~3 secondary AAs per processor, e.g. 3 processors_per_round takes 9 secondary AAs.
$storage = 1000 ;
$min_round_cost = $processors_per_round * ( 21000 + $storage * 4 ) ;
if( !var[ $project ][ "count" ] ) bounce( "$project AA missing 'count'") ;
if( var[ $project ][ "count" ] < $min_poolsize ) bounce( "waiting for " || $project || " to have " || $min_poolsize || " registered obots" ) ;
if( trigger.data.computation_rounds ) bounce( " computation_rounds = " || var[ 'computation_rounds' ] ) ;
$min_poolsize >= 1 // Should be at least greater than processors_per_round, use 1 for demo
}",
"messages": {
"cases": [
{
"if": "{ // REQUEST NEW ROUND
if( !trigger.data.message AND !trigger.data.round AND trigger.output[[asset=base]] < $min_round_cost ) bounce( 'need to send ' || $min_round_cost || ' to request a new round');
// TODO check for trigger.data.args
( !trigger.data.message AND !trigger.data.round ) // means not messages from project nor obot
}",
"init": "{
$process = '{ "args": ' || '"obotic"' || ', "processor": 1, "round": ' || ( var[ "round" ] + 1 ) || ' }' ;
}",
"messages": [
{
"app": "data",
"payload": {
"message": "{ $process }",
"nosend": true
}
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $project }",
"amount": "{ trigger.output[[asset=base]] - $storage }"
}
]
}
},
{
"app": "state",
"state": "{ var[ "round" ] += 1 ; }"
}
]
},
{
"if": "{ // START ROUND
trigger.address == $project AND trigger.data.message AND trigger.data.choosen
}",
"init": "{
$process = json_parse( trigger.data.message ) ;
$args = json_stringify( $process.args ) ;
$processor = json_parse( $process.processor ) ;
$round = $process.round ;
$morebot = '{ "args": ' || $args || ', "processor": ' || ( $processor + 1 ) || ', "round": ' || $round || ' }' ;
// do morebot here
$obot = trigger.data.choosen ;
$fee = var[ $obot ][ "fee" ] otherwise 21000 ;
}",
"messages": [
{
"if": "{ $processor < $processors_per_round AND trigger.output[[asset=base]] > ( $fee + $storage )
}",
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $project }",
"amount": "{ trigger.output[[asset=base]] - ( $fee + $storage ) }"
},
{
"address": "{ $obot }",
"amount": "{ $fee }"
}
]
}
},
{
"if": "{ $processor < $processors_per_round AND trigger.output[[asset=base]] > ( $fee + $storage )
}",
"app": "data",
"payload": {
"message": "{ $morebot }",
"args": "{ $args }",
"round": "{ $round }",
"nosend": true
}
},
{
"if": "{ $processor >= $processors_per_round AND trigger.output[[asset=base]] > $fee }",
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $obot }",
"amount": "{ $fee }"
}
]
}
},
{
"if": "{ $processor >= $processors_per_round AND trigger.output[[asset=base]] > $fee }",
"app": "data",
"payload": {
"args": "{ $args }",
"round": "{ $round }"
}
},
{
"app": "state",
"state": "{ // ROUND ADMINISTRATOR
// debug
// response[ "processor" ] = $processor ;
// response[ "morebot" ] = $morebot ;
// response[ "args" ] = $args ;
// response[ "round" ] = $round ;
var[ $round || "_" || $obot ] = "awaiting result" ; // valid processor
var[ $round || "_deadline" ] = timestamp + 43200 ; // start countdown
}"
}
]
},
{
"if": "{ // RANK RESULTS
// cant use app: poll because results are not pre-determined
$round = trigger.data.round ;
if( $round ){
$obot = trigger.data.address ;
$ro = $round || "_" || $obot ;
if( !var[ $ro ] ) bounce( "not a valid processor or round") ;
if( var[ $ro ] != "awaiting result" ) bounce( "already submitted result hash " || var[ $round || "_" || $obot ] ) ;
if( var[ $round || "_deadline" ] < timestamp ) bounce( "round is already over" ) ;
$hash = sha256( trigger.data.result ) ;
}
$round
}",
"messages": [
{
"app": "state",
"state": "{
var[ $ro ] = $hash ; // save result hash
$rh = $round || "_" || $hash ;
var[ $rh || "_submitters" ] = var[ $rh || "_submitters" ] || ", " || $obot ; // list of submitters
var[ $rh ] += 1 ; // votes
if( var[ $round || "_highest_rank" ] == false ) var[ $round || "_highest_rank" ] = 0 ;
if( var[ $rh ] > var[ $round || "_highest_rank" ] ){ // new highest rank
var[ $round || "_best_result" ] = $hash ;
var[ $round || "_highest_rank" ] = var[ $rh ] ;
}
}"
}
]
},
{
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "
HFNBIQTUNVMRM7PDP6NT2QRKLR62FOGR"
}
]
}
},
{
"app": "state",
"state": "{ if( !var[ "owner" ] ) var[ "owner" ] = "
HFNBIQTUNVMRM7PDP6NT2QRKLR62FOGR"; }"
}
]
}
]
}
}
]
}
}
]