首页 > 解决方案 > 简单区块链实现的工作量证明算法(F#)

问题描述

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

问题是我无法让工作量证明算法发挥作用。

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 中的指南以完全相同的方式创建这样的算法时,您将如何实际创建这些算法之一?

标签: f#blockchainsha256

解决方案


你的工作量证明算法有问题。您的 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)

推荐阅读