Я пытаюсь написать программу, которая одновременно добывает блок биткойнов. Я настроил его так, чтобы у каждой горутины был начальный начальный одноразовый номер, каждый из которых является долей 4, т.е. 2**64 - 1 (максимальное количество типов uint64) / 1 или 2, или 3, или 4.
Только один из этих майнеров столкнется с правильным одноразовым номером, и когда это произойдет, я хотел бы, чтобы он передал его менеджеру майнера через канал, и когда это произойдет, я бы хотел, чтобы остальные 3 майнера остановили то, что они делают.
Единственная проблема в том, что я понятия не имею, как уничтожить запущенную горутину, и есть ли вообще способ сделать то, о чем я прошу.
func miner(blockNumber int, transactions string, previousHash string, zeroPrefix string, startNonce uint64, nonceChan chan uint64, hashChan chan string) {
var text string
var newHash string
for {
text = strconv.Itoa(blockNumber) + transactions + previousHash + strconv.FormatUint(startNonce, 10)
newHash = encrypt(text)
if startswith(newHash, zeroPrefix) {
nonceChan <- startNonce
hashChan <- newHash
close(nonceChan)
close(hashChan)
break
} else {
startNonce++
}
}
}
func mine(blockNumber int, transactions string, previousHash string, zeroPrefix int) Block {
var prefixString string
var newHash string
var nonce uint64
var startNonce uint64
nonceChan := make(chan uint64)
hashChan := make(chan string)
for i := 0; i < zeroPrefix; i++ {
prefixString += "0"
}
start := time.Now()
for i := 0; i < 4; i++{
// This line is for deciding at what nonce value a miner should start at.
startNonce = uint64((float64(i) / 4) * math.Pow(2, 64))
go func() {
fmt.Println("Started miner with start nonce of", startNonce)
miner(blockNumber, transactions, previousHash, prefixString, startNonce, nonceChan, hashChan)
}()
}
nonce = <- nonceChan
newHash = <- hashChan
// Here is where I would like to destroy the other three miners
block := Block{
blockNumber,
transactions,
previousHash,
newHash,
nonce,
zeroPrefix,
time.Since(start),
}
return block
}