func (a *BuyActivity) transmitWorkChunked(log bitwrk.Logger, client *http.Client) (io.ReadCloser, error) { if r, err := a.requestMissingChunks(log.New("request missing chunks"), client); err != nil { return nil, err } else { defer r.Close() numChunks := a.workFile.NumChunks() if numChunks > 16384 { return nil, fmt.Errorf("Work file too big: %d chunks.", numChunks) } wishList := make([]byte, int(numChunks+7)/8) if _, err := io.ReadFull(r, wishList); err != nil { return nil, fmt.Errorf("Error decoding list of missing chunks: %v", err) } return a.sendMissingChunksAndReturnResult(log.New("send work chunk data"), client, wishList) } }
func (a *BuyActivity) doPerformBuy(log bitwrk.Logger, interrupt <-chan bool) (cafs.File, error) { if err := a.beginTrade(log, interrupt); err != nil { return nil, err } // draw random bytes for buyer's secret var secret bitwrk.Thash if _, err := rand.Reader.Read(secret[:]); err != nil { return nil, err } a.buyerSecret = &secret log.Printf("Computed buyer's secret.") // Get work hash var workHash, workSecretHash bitwrk.Thash workHash = bitwrk.Thash(a.workFile.Key()) // compute workSecretHash = hash(workHash | secret) hash := sha256.New() hash.Write(workHash[:]) hash.Write(secret[:]) hash.Sum(workSecretHash[:0]) // Start polling for transaction state changes in background abortPolling := make(chan bool) defer func() { abortPolling <- true // Stop polling when sell has ended }() go func() { a.pollTransaction(log, abortPolling) }() if err := SendTxMessageEstablishBuyer(a.txId, a.identity, workHash, workSecretHash); err != nil { return nil, fmt.Errorf("Error establishing buyer: %v", err) } if err := a.waitForTransactionPhase(log.New("establishing"), bitwrk.PhaseTransmitting, bitwrk.PhaseBuyerEstablished); err != nil { return nil, fmt.Errorf("Error awaiting TRANSMITTING phase: %v", err) } if err := a.interactWithSeller(log.New("transmitting")); err != nil { return nil, fmt.Errorf("Error transmitting work and receiving encrypted result: %v", err) } if err := a.waitForTransactionPhase(log, bitwrk.PhaseUnverified, bitwrk.PhaseTransmitting, bitwrk.PhaseWorking); err != nil { return nil, fmt.Errorf("Error awaiting UNVERIFIED phase: %v", err) } a.encResultKey = a.tx.ResultDecryptionKey if err := a.decryptResult(); err != nil { return nil, fmt.Errorf("Error decrypting result: %v", err) } if err := SendTxMessageAcceptResult(a.txId, a.identity); err != nil { return nil, fmt.Errorf("Failed to send 'accept result' message: %v", err) } a.waitWhile(func() bool { return a.tx.State == bitwrk.StateActive }) return a.resultFile, nil }