// TODO: if in tcp mode associate each hostname in the file with a different // port. Get the remote address of this computer to combine with those for the // complete hostnames to be used by the hosts. func LoadJSON(file []byte, optsSlice ...ConfigOptions) (*HostConfig, error) { opts := ConfigOptions{} if len(optsSlice) > 0 { opts = optsSlice[0] } hc := NewHostConfig() var cf ConfigFile err := json.Unmarshal(file, &cf) if err != nil { return hc, err } connT := GoC if cf.Conn == "tcp" { connT = TcpC } // options override file if opts.ConnType == "tcp" { connT = TcpC } dir := hc.Dir hosts := make(map[string]coconet.Host) nameToAddr := make(map[string]string) if connT == GoC { for _, h := range cf.Hosts { if _, ok := hc.Hosts[h]; !ok { nameToAddr[h] = h // it doesn't make sense to only make 1 go host if opts.Faulty == true { gohost := coconet.NewGoHost(h, dir) hosts[h] = coconet.NewFaultyHost(gohost) } else { hosts[h] = coconet.NewGoHost(h, dir) } } } } else if connT == TcpC { localAddr := "" if opts.GenHosts { localAddr, err = GetAddress() if err != nil { return nil, err } } for i, h := range cf.Hosts { addr := h if opts.GenHosts { p := strconv.Itoa(StartConfigPort) addr = localAddr + ":" + p //log.Println("created new host address: ", addr) StartConfigPort += 10 } else if opts.Port != "" { log.Println("attempting to rewrite port: ", opts.Port) // if the port has been specified change the port hostport := strings.Split(addr, ":") log.Println(hostport) if len(hostport) == 2 { addr = hostport[0] + ":" + opts.Port } log.Println(addr) } else if len(opts.Hostnames) != 0 { addr = opts.Hostnames[i] } nameToAddr[h] = addr // add to the hosts list if we havent added it before if _, ok := hc.Hosts[addr]; !ok { // only create the tcp hosts requested if opts.Host == "" || opts.Host == addr { if opts.Faulty == true { tcpHost := coconet.NewTCPHost(addr) hosts[addr] = coconet.NewFaultyHost(tcpHost) } else { hosts[addr] = coconet.NewTCPHost(addr) } } else { hosts[addr] = nil // it is there but not backed } } } } suite := nist.NewAES128SHA256P256() if opts.Suite != nil { suite = opts.Suite } rand := suite.Cipher([]byte("example")) fmt.Println("hosts", hosts) _, err = ConstructTree(cf.Tree, hc, "", suite, rand, hosts, nameToAddr, opts) if connT != GoC { hc.Dir = nil } log.Println("IN LOAD JSON") // add a hostlist to each of the signing nodes var hostList []string for h := range hosts { hostList = append(hostList, h) } for _, sn := range hc.SNodes { sn.HostList = make([]string, len(hostList)) sortable := sort.StringSlice(hostList) sortable.Sort() copy(sn.HostList, sortable) // set host list on view 0 log.Println("in config hostlist", sn.HostList) sn.SetHostList(0, sn.HostList) } return hc, err }
func runStaticTest(signType sign.Type, RoundsPerView int, faultyNodes ...int) error { // Crypto setup suite := nist.NewAES128SHA256P256() rand := suite.Cipher([]byte("example")) // number of nodes for the test nNodes := 4 // create new directory for communication between peers dir := coconet.NewGoDirectory() // Create Hosts and Peers h := make([]coconet.Host, nNodes) for i := 0; i < nNodes; i++ { hostName := "host" + strconv.Itoa(i) if len(faultyNodes) > 0 { h[i] = &coconet.FaultyHost{} gohost := coconet.NewGoHost(hostName, dir) h[i] = coconet.NewFaultyHost(gohost) } else { h[i] = coconet.NewGoHost(hostName, dir) } } for _, fh := range faultyNodes { h[fh].(*coconet.FaultyHost).SetDeadFor("response", true) } // Create Signing Nodes out of the hosts nodes := make([]*sign.Node, nNodes) for i := 0; i < nNodes; i++ { nodes[i] = sign.NewNode(h[i], suite, rand) nodes[i].Type = signType nodes[i].GenSetPool() nodes[i].RoundsPerView = RoundsPerView defer nodes[i].Close() h[i].SetPubKey(nodes[i].PubKey) // To test the already keyed signing node, uncomment // PrivKey := suite.Secret().Pick(rand) // nodes[i] = NewKeyedNode(h[i], suite, PrivKey) } nodes[0].Height = 2 nodes[1].Height = 1 nodes[2].Height = 0 nodes[3].Height = 0 // Add edges to parents h[1].AddParent(DefaultView, h[0].Name()) h[2].AddParent(DefaultView, h[1].Name()) h[3].AddParent(DefaultView, h[1].Name()) // Add edges to children, listen to children h[0].AddChildren(DefaultView, h[1].Name()) h[1].AddChildren(DefaultView, h[2].Name(), h[3].Name()) for _, host := range h { host.Listen() host.Connect(0) } for i := 0; i < nNodes; i++ { if len(faultyNodes) > 0 { nodes[i].FailureRate = 1 } go func(i int) { // start listening for messages from within the tree nodes[i].Listen() }(i) } // Have root node initiate the signing protocol // via a simple annoucement nodes[0].LogTest = []byte("Hello World") // return nodes[0].Announce(DefaultView, &sign.AnnouncementMessage{LogTest: nodes[0].LogTest, Round: 1}) return nodes[0].StartAnnouncement(&sign.AnnouncementMessage{LogTest: nodes[0].LogTest, Round: 1}) }