1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
let digest text = text |> Digestif.BLAKE2B.digest_string |> Digestif.BLAKE2B.to_hex let rec __mining input pattern nonce = let length = Core.String.length pattern in let salt = Nocrypto.Numeric.Z.to_cstruct_be nonce in let message = Cstruct.append input salt in let result = Nocrypto.Hash.SHA256.digest message in let digest = Hex.show @@ Hex.of_cstruct result in let part = Core.String.sub ~pos:0 ~len:length digest in if pattern = part then result else __mining input pattern @@ Z.succ nonce let mine ~difficulty text = let input = Cstruct.of_string text in let nonce = Z.zero in let pattern = Core.String.init difficulty ~f:(Core.const '0') in __mining input pattern nonce