| 327 | } |
| 328 | |
| 329 | func (d *DosNode) handleCR(cr *onchain.LogStartCommitReveal, randSeed *big.Int) { |
| 330 | |
| 331 | // Generate random numbers in range [0..randSeed] |
| 332 | if randSeed.Cmp(big.NewInt(1)) == -1 { |
| 333 | randSeed, _ = new(big.Int).SetString("21888242871839275222246405745257275088548364400416034343698204186575808495617", 10) |
| 334 | } |
| 335 | sec, err := rand.Int(rand.Reader, randSeed) |
| 336 | if err != nil { |
| 337 | d.logger.Error(err) |
| 338 | return |
| 339 | } |
| 340 | h := sha3.NewKeccak256() |
| 341 | h.Write(abi.U256(sec)) |
| 342 | b := h.Sum(nil) |
| 343 | hash := byte32(b) |
| 344 | currentBlockNumber, err := d.chain.CurrentBlock() |
| 345 | if err != nil { |
| 346 | d.logger.Error(err) |
| 347 | return |
| 348 | } |
| 349 | |
| 350 | cid := cr.Cid |
| 351 | waitCommit := cr.StartBlock.Uint64() - currentBlockNumber + 1 |
| 352 | waitReveal := cr.CommitDuration.Uint64() + 1 |
| 353 | waitRandom := cr.RevealDuration.Uint64() + 1 |
| 354 | if waitCommit < 0 { |
| 355 | waitReveal = waitReveal - waitCommit |
| 356 | waitRandom = waitRandom - waitCommit |
| 357 | waitCommit = 0 |
| 358 | } |
| 359 | |
| 360 | time.Sleep(time.Duration(waitCommit*15) * time.Second) |
| 361 | d.logger.Info("[DOS] Commit") |
| 362 | d.logger.Event("Commit", map[string]interface{}{"CID": fmt.Sprintf("%x", cid)}) |
| 363 | if err := d.chain.Commit(cid, *hash); err != nil { |
| 364 | d.logger.Error(err) |
| 365 | } |
| 366 | <-time.After(time.Duration(waitReveal*15) * time.Second) |
| 367 | |
| 368 | d.logger.Info("[DOS] Reveal") |
| 369 | d.logger.Event("Reveal", map[string]interface{}{"CID": fmt.Sprintf("%x", cid)}) |
| 370 | if err := d.chain.Reveal(cid, sec); err != nil { |
| 371 | d.logger.Error(err) |
| 372 | } |
| 373 | } |
| 374 | |
| 375 | func byte32(s []byte) (a *[32]byte) { |
| 376 | if len(a) <= len(s) { |