// Compute quality of the answer. Also builds a verifier // return: quality in float64 func (c *Client) Quality(challenge []byte, a block.Answer) float64 { nodes := c.verifier.SelectChallenges(challenge) if !c.verifier.VerifySpace(nodes, a.Hashes, a.Parents, a.Proofs, a.PProofs) { return -1 } all := util.Concat(a.Hashes) answerHash := sha3.Sum256(all) x := new(big.Float).SetInt(new(big.Int).SetBytes(answerHash[:])) num, _ := util.Root(x, a.Size).Float64() den := math.Exp2(float64(1<<8) / float64(a.Size)) return num / den }
func NewBlock(old *Block, prf PoS, ts []Transaction, signer crypto.Signer) *Block { oldH, err := old.Hash.MarshalBinary() if err != nil { panic(err) } prevHash := sha3.Sum256(oldH) h := Hash{ Hash: prevHash[:], Proof: prf, } var tsBytes []byte for i := range ts { b, err := ts[i].MarshalBinary() if err != nil { panic(err) } tsBytes = append(tsBytes, b...) } sigBytes := util.Concat([][]byte{old.Sig.Tsig, old.Sig.Ssig}) tsig, err := signer.Sign(rand.Reader, tsBytes, crypto.SHA3_256) if err != nil { panic(err) } ssig, err := signer.Sign(rand.Reader, sigBytes, crypto.SHA3_256) if err != nil { panic(err) } sig := Signature{ Tsig: tsig, Ssig: ssig, } b := Block{ Id: old.Id + 1, Hash: h, Trans: ts, Sig: sig, } return &b }