简单的区块链实现(F#)的工作量证明算法

时间:2019-05-07 17:57:27

标签: f# blockchain sha256

我目前正在尝试了解区块链并了解基本原理。所以我试图实现一个简单的区块链

问题是我无法获得工作证明算法的功能。

let sha256 = System.Security.Cryptography.SHA256.Create()
let hash (n : int) =
    sha256.ComputeHash (BitConverter.GetBytes n)
    |> BitConverter.ToString
    |> fun x -> x.Replace ("-", "")

let verify x = hash x |> fun p1 -> p1.EndsWith "0000"

let rec proofOfWork p0 x =
  if verify (p0 + x) then
     x
  else
     proofOfWork p0 (x + 1)

[<EntryPoint>]
let main argv =

   let s = proofOfWork 100 1
   let s' = proofOfWork s 1 
   let s'' = proofOfWork s' 1

   0 

这将返回一个闭环“ 10312-> 100-> 10312”,这似乎是不正确的,如果您考虑一下,这是有道理的。那么当我按照python指南以完全相同的方式制作这样的算法时,您实际上将如何创建这些算法之一?

1 个答案:

答案 0 :(得分:1)

您的工作量证明算法有问题。您的PoW算法应该获取一些数据X并找到一个数字Y,以使附加到X的Y的哈希值产生一个数字,在您的情况下,该数字以4个尾随零结尾。

可能的解决方案

let rec proofOfWork p0 x =
  let pow' = (string x) + (string p0) |> int
  if verify (pow') then
     x
  else
     proofOfWork p0 (x + 1)