专栏名称: 区块链技术学习
致力于区块链技术的学习和普及,对区块链技术和相关企业事件进行深度分析和研判,探索去中心化账本技术应用领域。
目录
相关文章推荐
医药经济报  ·  徐景和在广东调研化妆品监管工作 ·  4 天前  
51好读  ›  专栏  ›  区块链技术学习

50行C#代码构建小型区块链

区块链技术学习  · 公众号  ·  · 2019-08-11 12:30

正文

来自:博客园,作者:张小三、

链接:https://www.cnblogs.com/xiaoyu5062/p/8795299.html


本文介绍了如何使用C#构建一个小型的区块链技术,使用控制台实现。

虽然有人认为区块链本身仍有很多问题需要解决,但毫无疑问,这种新颖的技术是计算机界的奇迹。 但是,究竟什么是一个区块链?

区块链一种数字记账本,其中以比特币或其他加密方式按时间顺序并公开记录地进行交易。

通俗的讲,区块链是一个公共数据库,其中新产生的数据存储在称为块的容器中,并被添加到具有已经存在数据的区块构成的链中。 在比特币和其他加密货币的情况下,这些数据是一组交易。 数据也可以是任何类型的。


区块链技术已经带来了全新的,完全数字化的货币,如比特币和莱特币,它们不由中央机构发行或管理的,这给相信今天的银行体系是骗局或失败的个人带来了新的自由。 区块链也以像以太坊这样的技术形式革新了分布式计算,它引入了有趣的概念,如智能合约。


在本文中,我将在不到50行的Python 2代码(本文已用C#实现)中制作一个简单的区块链。 这将被称为SnakeCoin。

我们首先定义我们的区块将是什么样子。 在区块链中,每个块都存储有时间戳和可选的索引。 在SnakeCoin中,我们将同时存储两者。 并且为了帮助确保整个块链的完整性,每个块将具有自识别哈希值的功能。 像比特币一样,每个区块将包括作为区块的索引的哈希值,时间戳,数据以及前一个块的哈希值。 哦,数据可以是任何你想要的。


public class Block
    {
        public int index { getset; }
        public string hash { getset; }
        public long timestamp { getset; }
        public string data { getset; }
        public string previous_hash { getset; }
        public Block(int index,long timestamp, string data, string previous_hash)
        
{
            this.index = index;
            this.timestamp = timestamp;
            this.data = data;
            this.previous_hash = previous_hash;
            this.hash = HashBlock();
        }

        private string HashBlock()
        
{
            return Sha256(index+timestamp+data+previous_hash);
        }
        public static string Sha256(string strData)
        
{
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(strData);
            try
            {
                SHA256 sha256 = new SHA256CryptoServiceProvider();
                byte[] retVal = sha256.ComputeHash(bytValue);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i                 {
                    sb.Append(retVal[i].ToString("x2"));
                }
                return sb.ToString();
            }
            catch (Exception ex)
            {
                throw new Exception("GetSHA256HashFromString() fail,error:" + ex.Message);
            }
        }
    }


真棒!我们已经有了块结构了,但是我们正在创建一个区块链。我们需要开始向实际的链条添加区块。如前所述,每个块都需要上一个块的信息。但是这就出现了一个问题:块区中的第一个区块怎么来的?那么,第一个区块,或起创世区块,是一个特殊的块。在许多情况下,它是手动添加的或具有允许添加的唯一逻辑。


为了简化,我们将创建一个函数,只需返回一个创世区块,该区块的索引为0,它在“previous hash”参数中具有任意数据值和任意值。


static Block CreateGenesisBlock() {
            return new Block(0, GetTimeStamp(), "GenesisBlock""0");
        }


现在我们创建了一个创世区块,我们需要一个函数来生成区块链中的后续区块。该函数将将链中的前一个区块作为参数,创建要生成的区块的数据,并返回具有其相应数据的新块。新产生的区块会存储先前区块中的哈希值,区块链的完整性随着每个新的区块而增加。如果我们没有这样做,其他人会很容易篡改历史记录,并用自己的全新数据替代我们的链条。这个哈希链作为加密证明,有助于确保一旦新区块被添加到区块链中,它不能被替换或删除。


 static Block NextBlock(Block last_block)
        
{
         return new Block(last_block.index + 1, GetTimeStamp(), "Hey! I'm block " + ++last_block.index, last_block.hash);
        }


这是本次任务的重心。现在我们可以创建我们的区块链!在我们的例子中,区块链本身就是一个简单的Python列表。列表的第一个元素是创世区块。当然,我们需要添加后续的区块。因为SnakeCoin是最小的区块链,所以我们只添加了20个新的块。我们可以用for循环来做到这一点


static






请到「今天看啥」查看全文