func ConnectToNode(dst string, timeout time.Duration, retry bool, cb NodeChannel) { addrDst, err := net.ResolveTCPAddr("tcp4", dst) networkError(err) var con *net.TCPConn = nil loop: for { breakChannel := make(chan bool) go func() { con, err = net.DialTCP("tcp", nil, addrDst) if con != nil { cb <- &Node{con, int(time.Now().Unix())} breakChannel <- true } }() select { case <-helpers.Timeout(timeout): if !retry { break loop } case <-breakChannel: break loop } } }
func (bl *Blockchain) GenerateBlocks() chan Block { interrupt := make(chan Block) go func() { block := <-interrupt loop: fmt.Println("Starting Proof of Work...") block.BlockHeader.MerkelRoot = block.GenerateMerkelRoot() block.BlockHeader.Nonce = 0 block.BlockHeader.Timestamp = uint32(time.Now().Unix()) for true { sleepTime := time.Nanosecond if block.TransactionSlice.Len() > 0 { if CheckProofOfWork(BLOCK_POW, block.Hash()) { block.Signature = block.Sign(Core.Keypair) bl.BlocksQueue <- block sleepTime = time.Hour * 24 fmt.Println("Found Block!") } else { block.BlockHeader.Nonce += 1 } } else { sleepTime = time.Hour * 24 fmt.Println("No trans sleep") } select { case block = <-interrupt: goto loop case <-helpers.Timeout(sleepTime): continue } } }() return interrupt }