200 行代码使用 C# 实现区块链

文章原文来自:Code your own blockchain in less than 200 lines of Go!,原始文章是通过 Go 语言来实现自己的区块链的,这里我们参照该文章来使用 C# + Asp.Net Core 实现自己的区块链。在这里我也参考了 这篇译文 。 1.项目配置 首先新建一个 Asp.Net Core 项目,然后选择 Empty Project(空项目) 类型,建立完成后无需进行任何配置。 2.数据模型 这里我们来创建一个具体的区块数据模型,使用的是 Struct 结构体。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public struct Block { /// <summary> /// 区块位置 /// </summary> public int Index { get; set; } /// <summary> /// 区块生成时间戳 /// </summary> public string TimeStamp { get; set; } /// <summary> /// 心率数值 /// </summary> public int BPM { get; set; } /// <summary> /// 区块 SHA-256 散列值 /// </summary> public string Hash { get; set; } /// <summary> /// 前一个区块 SHA-256 散列值 /// </summary> public string PrevHash { get; set; } } 这里各个字段的含义已经在注释上方标明了,这里不在过多赘述。 之后我们新建一个 BlockGenerator 静态类用于管理区块链,并且使用一个 List 保存区块链数据。

Linux 下 Shell 的自动交互

在编写脚本的时候经常会遇到这种情况,某些程序的命令执行的之后可能会要求用户进行输入,这个时候就需要一些特殊写法来应对这种问题了。这里参考 这篇文章提到可以使用 delimiter 分界符来解决。 也就是说在 Shell 将 delimiter 分界符之后的的所有内容都会当做输入,直到遇到第二个分界符,而最常见的分界符就是 EOF 分界符。 1 2 3 docker container prune << EOF y EOF 类似于上述代码。

使用 Jenkins 为 .Net Core 实现持续集成/部署

在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次在本地发布之后还需要打包,上传,部署,十分繁琐。故这里采用了比较成熟的Jenkins 作为持续部署环境。

为了方便安装,我们这里使用了 Docker 来进行安装,至于 Docker 安装的步骤这里不在赘述,详情可以参考**这一篇博文**。

上面安装的是一个较老的版本,这里推荐参考** Docker 官方文档**来进行安装。

设计模式(创建型模式):建造者模式

介绍完工厂模式,现在来看一下建造者模式。建造者模式就是将一系列对象组装为一个完整对象并且返回给用户,例如汽车,就是需要由各个部件来由工人建造成一个复杂的组合实体,这个复杂实体的构造过程就被外部化到一个建造者的对象,由这个建造者对象返回创建好的实体,是不是跟工厂很像呀? 建造者模式则主要由几个对象构成: 抽象建造者 具体建造者 指挥者 产品角色 UML 类图如下: 抽象建造者负责定义建造者的行为,这里使用接口/抽象类均可,而具体建造者则实现了抽象建造者,负责具体的建造行为。 指挥者是针对抽象建造者进行变成,是将这些建造者的建造行为进行逻辑处理,不论你传入哪种不同的建造者,都能保证建造流程一致性。 而建造者模式则是将构造复杂对象的内部与对象的具体表现隔离开来,使得同样的建造过程可以创造出不同的表现。 上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 // 抽象建造者 public abstract class AbsBuilder { public abstract void AddHead(); public abstract void AddBody(); public abstract void AddFoot(); public abstract Product GetResult(); } // 抽象产品 public abstract class Product { public abstract void Show(); } // 字符串产品 A public class ProductA : Product { public string Content {get; set;} public override void Show() { Console.

使用 FRP 实现内网穿透

一般来说国内家用网络没有独立IP,而且可能你还在几层内网里面,这个时候如果想在外面访问自己家里搭建的网站服务,直接用 IP 访问显然不太现实,这个时候就可以使用 FRP 或者 ngrok 这样的工具来实现内网穿透。 这里我选择使用的是 FRP,NGROK 配置十分繁琐,而 FRP 的话一般来说几分钟就可以搞定。(虽然我是搞了三个小时,原因是防火墙的问题…) 首先我们需要去下载 FRP 的服务端与客户端,这个作者已经打包好了,在这个地址就可以下载:https://github.com/fatedier/frp/releases。基本囊括了主流的平台,我这里采用的服务端是 CentOs 7.x 所以我下载了 Linux x64 的版本,但是每个平台的使用方法都一样,所以不会很麻烦。 具体的使用方法可以在 GITHUB 的 README 处看到。这里我仅讲述基本步骤,首先将下载完成的服务端解压,然后编辑 frps.ini文件,进行如下配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [common] # 监听的服务器地址 bind_addr = 0.0.0.0 # 监听的端口 bind_port = 7000 # HTTP 映射端口 vhost_http_port = 8080 # 仪表盘监听地址 dashboard_addr = 0.0.0.0 # 仪表盘监听端口 dashboard_port = 7500 # 仪表盘管理用户 dashboard_user = admin # 仪表盘管理用户密码 dashboard_pwd = admin # FRP 连接密钥 privilege_token = 12345678 # 授权过期时间 authentication_timeout = 900 之后运行服务端:
Built with Hugo
主题 StackJimmy 设计