f# - 简单区块链实现的工作量证明算法(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 中的指南以完全相同的方式创建这样的算法时,您将如何实际创建这些算法之一?
解决方案
你的工作量证明算法有问题。您的 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)