牛骨文教育服务平台(让学习变的简单)
博文笔记

【C#】简易区块链

创建时间:2018-02-11 投稿人: 浏览次数:1090

自学C#和区块链后的小实践

using System.Collections;
using System;
using static System.Console;


//简易区块链
namespace test
{   
    //区块
    public class Block
    {
        //基本属性:上一个区块的Hash值,交易信息,Nonce变量,当前区块的Hash
        private int previousBlockHashCode;
        private string transactionInfo;
        private string nonce;
        private int blockHashCode;

        //构造函数
        public Block()
        {
            transactionInfo = "the Creation";
            previousBlockHashCode = 0;
            blockHashCode = 0;
        }

        public Block(string tranInfo,int previousBlockHash)
        {
            transactionInfo = tranInfo;
            previousBlockHashCode = previousBlockHash;
        }

        //重载GetHashCode函数
        public override int GetHashCode()
        {
            nonce = DateTime.Now.ToFileTimeUtc().ToString() + transactionInfo + previousBlockHashCode;
            return nonce.GetHashCode();
        }

        public int BlockHashCode
        {
            get { return blockHashCode; }
            set { blockHashCode = value; }
        }
        public string TransactionInfo
        {
            get { return transactionInfo; }
        }
        public int PreviousBlockHashCode
        {
            get { return previousBlockHashCode; }
        }
        public string Nonce
        {
            get { return nonce; }
        }
    }

    //区块链
    public class Chain: DictionaryBase
    {
        //重载添加方法
        public void Add(Block newBlock)
        {
            Dictionary.Add(newBlock.BlockHashCode, newBlock);
        }
        
        public Chain()
        {
            WriteLine("Create a BlockChain.");
            this.Add(new Block());
        }

        //文字索引
        public Block this[int hash]
        {
            get { return (Block)Dictionary[hash]; }
        }

        //通过Hash遍历输出区块链
        public void GetChainInfo(Block nowBlock)
        {
            WriteLine("

Put out the BlockChain: ");
            Block p = nowBlock;
            do
            {
                WriteLine(p.TransactionInfo);
                p = this[p.PreviousBlockHashCode];
            } while (p.BlockHashCode != 0);
            WriteLine(p.TransactionInfo);
        }
    }

    //广播当前Hash
    public class Broadcast
    {
        public static int hashNow;
    }

    //挖矿
    public class Mining
    {
        //获得Hash值
        public static void GetHash(Block b)
        {
            WriteLine("Wait...");
            int hash;
            while (true)
            {
                hash = b.GetHashCode();
                int remainder = hash % 50;//难度设置
                if (remainder == 22)
                {
                    WriteLine("Mining succeed.");
                    break;
                } 
            }
            Broadcast.hashNow = hash;
            b.BlockHashCode = hash;
        } 
        
        //挖矿程序
        public static void Mine(Chain chain,Block block)
        {
            WriteLine("Start to get HashCode.");
            GetHash(block);
            chain.Add(block);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Block testBlock = new Block("transaction no.1", 0);
            Chain testChain = new Chain();
            Mining.Mine(testChain, testBlock);
            testChain.GetChainInfo(testBlock);
        }
    }
}


界面不高兴写了

 

自带GetHashCode函数:

(1)值类型:返回结构中第一个值的hash

(2)引用类型:返回引用的引用源的hash


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。