1 module tagion.tools.boot.genesis; 2 3 import std.algorithm; 4 import std.array; 5 import tagion.basic.Types; 6 import tagion.crypto.Types : Pubkey; 7 import tagion.hibon.Document; 8 import tagion.hibon.HiBONJSON; 9 import tagion.hibon.HiBONtoText : decode; 10 import tagion.script.common; 11 import tagion.script.namerecords; 12 import tagion.tools.Basic; 13 import tagion.tools.toolsexception; 14 import tagion.utils.StdTime; 15 16 17 @safe: 18 Document[] createGenesis(const(string[]) nodes_param, Document testamony, TagionGlobals globals) { 19 import std.stdio; 20 21 Document[] result; 22 static struct NodeSettings { 23 string name; 24 Pubkey owner; 25 string address; 26 this(string params) { 27 const list = params.split(","); 28 check(list.length == 3, 29 "Argument %s should have three parameter seperated with a ','", params); 30 name = list[0]; 31 owner = Pubkey(list[1].decode); 32 address = list[2]; 33 } 34 } 35 36 const node_settings = nodes_param 37 .map!((param) => NodeSettings(param)) 38 .array; 39 40 const time = currentTime; 41 NetworkNameCard[] name_cards; 42 NetworkNodeRecord[] node_records; 43 foreach (node_setting; node_settings) { 44 NetworkNameCard name_card; 45 name_card.name = node_setting.name; 46 name_card.owner = node_setting.owner.mut; 47 //name_card.address=node_setting.address; 48 name_card.lang = "en"; 49 name_card.time = cast(sdt_t) time; 50 name_cards ~= name_card; 51 NetworkNodeRecord node_record; 52 node_record.channel = node_setting.owner.mut; 53 node_record.name = node_setting.name; 54 node_record.time = cast(sdt_t) time; 55 node_record.state = NetworkNodeRecord.State.ACTIVE; 56 node_record.address = node_setting.address; 57 node_records ~= node_record; 58 } 59 GenesisEpoch genesis_epoch; 60 genesis_epoch.epoch_number = 0; 61 genesis_epoch.nodes = node_settings 62 .map!((node_setting) => node_setting.owner.mut) 63 .array; 64 //.sort; 65 genesis_epoch.time = cast(sdt_t) time; 66 genesis_epoch.testamony = testamony; 67 genesis_epoch.globals = globals; 68 69 70 name_cards.each!((name_card) => verbose("%s", name_card.toPretty)); 71 node_records.each!((name_card) => verbose("%s", name_card.toPretty)); 72 verbose("%s", genesis_epoch.toPretty); 73 result ~= name_cards.map!((name_card) => name_card.toDoc).array; 74 75 result ~= node_records.map!(node_record => node_record.toDoc).array; 76 result ~= genesis_epoch.toDoc; 77 return result; 78 }