自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 资源 (2)
  • 收藏
  • 关注

原创 Docker部署Golang项目及镜像优化实战

Docker部署Golang项目及镜像优化实战今天在部署公司的项目时, 了解到目标服务器有Docker环境,于是就想着基于Docker来部署项目这篇文章记录了一次完整的构建镜像到优化的完整过程.基础环境DockerWindows10 (我的工作环境,其他平台操作一样)编辑Dockerfile文件,构建docker镜像基于简单,快速构建部署的原则,我选择在构建docker镜像时编译程序.即 上传项目源代码,通过Dockerfile命令声明完成编译,再运行二进制文件.先展示我的文件目

2021-03-24 16:52:20 549

原创 联盟链Quorum(基于raft共识)部署流程(一)

首先说明,本次的Quorum部署是在一台Ubuntu服务器上的,实际生产环境建议一个节点一台服务器。一台服务器上部署多个节点的流程跟多个服务器部署多个节点的流程其实是一样的。并且,经过我的亲身测试,Quorum链4个节点就能够正常运行起来。我的演示系统环境时 Ubuntu 18.04 LTS环境要求:golang (ubuntu建议安装方法:sudo apt install go...

2020-04-02 15:37:51 2443 7

原创 以太坊开发入门,Remix IDE使用及简单的合约部署

Remix IDE是一个在线的智能合约编译,测试和部署工具。使用它可以很方便的和智能合约交互,最适合刚入手的以太坊开发者了。因为是在线的IDE,所以对开发者的操作系统没有要求。我自己现在用的Ubuntu,之前用的Windows开发。准备:1.Google Chrome // Firefox也是可以的2.MetaMask //MetaMa...

2019-06-06 17:30:07 3741 1

原创 基于Hardhat编写合约测试用例

为智能合约编写自动化测试至关重要,毕竟写智能合约多多少少都会跟用户资金挂钩。这里假设自己正在开发一个NFT交易平台,这个平台可以让用户售卖自己的NFT,包括ERC721和ERC1155,并且用户可以指定购买者需要支付指定的购买。我们先确定自己的测试功能和目标,为了文章篇幅不要太长,我们就以卖家用户调用,创建售卖订单功能为目标做测试。我们需要4个合约文件:前三种合约最简单的,我们不需要自己再去实现,直接引用Openzeppelin的合约代码即可。在目录下创建一个新的文件,并且把下面的代码粘贴进去这样需要

2022-07-01 17:14:02 4046 1

原创 基于 Openzeppelin 的可升级合约解决方案的注意事项

在编写可升级合约时请不要使用构造函数,我们知道可升级合约运行时逻辑与数据分离的,合约数据保存在中,我们编写的合约是,当合约部署时,调用初始化的数据是的,中的数据并没有被初始化,所以是无效的。包括声明时赋值初始值,因为这种做法相当于在构造函数中设置这些值。如果MyContract继承自合约 BaseContract, 那么BaseContract合约的初始化函数 initialize() 的modifier(修饰器) 必须使用 onlyInitializing,比如:声明状态变量声明状态变量时,不能对

2022-07-01 10:52:48 868

原创 可升级合约的原理-DelegateCall

在介绍时,我们需要带上方法一起介绍,并做对比。先说概念吧!DelegateCall:有一种特殊类型的消息调用,被称为 。它和一般的消息调用()的区别在于,目标地址的代码将在发起调用的合约的上下文中执行,并且 和 不变。 这意味着一个合约可以在运行时从另外一个地址动态加载代码。我不喜欢一上来就讲概念,毕竟太难理解。还是上代码演示吧Remix IDE:Remix是基于浏览器的 IDE,集成了编译器和 Solidity 运行时环境,不需要服务端组件,支持网页在线编写、部署和测试智能合约。本章主要是让大家快

2022-06-30 15:32:52 979

原创 基于Hardhat和Openzeppelin开发可升级合约(二)

在本章我将开始介绍和演示 基于 Openzeppelin 的基础可升级合约解决方案根据设计,智能合约是不可变的。但随着新的客户需求和产品设计的升级迭代,合约也需要升级。Openzeppelin 的基础可升级合约解决方案是将合约数据与逻辑分离。编码修改合约文件基于上一章中的项目进行修改, 所以这里还是修改 合约文件这里我们需要引用Openzeppelin的可升级合约库@openzeppelin/contracts-upgradeable这里我们做了两件事:需要重点说明了的是,在可升级合约中,不能使

2022-06-29 15:41:25 4171 6

原创 基于Hardhat和Openzeppelin开发可升级合约(一)

本章主要演示通过使用Hardhat框架快速开发普通合约(不可升级),在本地节点部署,并通过控制台与合约进行交互。希望通过这篇文章能让读者快速上手Hardhat框架可升级版合约将在下一章节开始等待 npm 拉取依赖完成即可不可升级合约我希望通过开发不可合约来让读者熟悉基于Hardhat的开发流程, 并可以在编写可升级合约时做对比添加如下合约代码我们假设这是我们开发的一个错误的合约, 因为我们在设置新的 storageValue 数值时, 多了 +1(这是为了演示的可以为之).我们先通过使用Har

2022-06-29 10:32:07 710

原创 简介智能合约开发框架-Hardhat

智能合约开发框架-Hardhat​简介Hardhat是一个编译、部署、测试和调试以太坊应用的开发环境。Hardhat内置了Hardhat网络,这是一个专为开发设计的本地以太坊网络。主要功能有Solidity调试,跟踪调用堆栈、 console.log() 和交易失败时的明确错误信息提示等。环境node.jspython安装npm install --global --production windows-build-toolsnpm install -g hardhat生成项目

2022-04-26 15:39:42 6402

原创 Ubuntu部署 Blockscout 区块链浏览器流程

Ubuntu部署 Blockscout 区块链浏览器流程

2022-04-15 18:41:50 6378 7

原创 Ubuntu(18,20,21)多版本docker & docker compose的快速安装

Ubuntu(18,20,21)多版本docker & docker compose的快速安装

2022-04-14 16:09:51 1223

原创 Windows Docker 配置国内镜像源的两种方法

WIndows Docker配置国内镜像源的两种方法

2022-04-14 12:45:03 36713 1

原创 Git常用命令

Git常用命令

2022-03-29 22:31:25 242

原创 Golang与设计模式-Abstract Factory抽象工厂模式

Abstract Factory抽象工厂模式是一种创建型设计模式。抽象工厂模式和 Factory工厂方法模式一样,都符合开闭原则。但是不同的是,工厂方法模式在增加一个具体产品的时候,都要增加对应的工厂。但是抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂。场景本文将以电子工厂生产电子产品为例来演示抽象工厂模式。我们会定义两种类型的产品手机Phone 和平板电脑 Pad,以及两个不同品牌的生产厂商苹果和华为。基本类型和接口首先定义手机接口Phone,以及一个打电话的方法Call()

2021-08-18 23:17:33 237

原创 Golang与设计模式-Builder建造者模式

Builder建造者模式也是一种创建型设计模式,建造者模式就是把一个复杂的对象分成多个简单的对象,然后对这些简单的对象一步步进行构建,从而组成了一个复杂的对象。建造者模式种有三个角色:建造者(Builder)负责定义生成实例的接口 具体建造者(ConcreteBuilder)实现了Builder接口,定义生成实例时被调用的方法 指挥者(Director)负责使用Builder接口生成实例。它不依赖ConcreteBuilder场景本文内容我们就拿组装电脑为例,因为电脑就是由多个组件组成,且

2021-08-18 00:14:44 752

原创 Golang与设计模式-Prototype原型模式

原型模式其实就是根据实例的原型生成新的实例的一种创建性设计模式。使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类。典型的应用就是依赖注入,做过.Net 和 Java开发的小伙伴应该对此很熟悉。go也有依赖注入框架场景本期场景就很简单了,我们实现了一个简单的依赖注入模型。基础类型和接口这是原型接口,需要实现依赖注入的实例必须实现这个接口// 产品接口(原型接口)type Product interface { // 用于演示的方法 Use() // 克隆方..

2021-08-11 23:16:01 244

原创 Golang与设计模式-Singleton单例模式

单例模式是我们工作中最长用到的设计模式之一,单例模式也是创建型设计模式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。单例模式一般分为两种实现方式:懒汉模式和饿汉模式饿汉模式表示程序在初始化阶段或使用前已创建出了一个实例,在程序后面的生命生命周期内将不再创建// 声明

2021-08-10 21:02:02 365

原创 Golang与设计模式-Factory工厂模式

工厂模式是创建型设计模式,在工厂模式中,父类决定实例的生成方式,但并不决定所生成的具体的类,具体的处理全部交给子类负责。工厂模式是使用Template模版模式来构建生成实例的工厂。这也是为什么我们要先学习模版模式的原因,而不像其他博主按照设计模式的类型划分后一类一类的学习。场景本期我们以一个制作身份证(IDCard)的程序来演示工厂模式。基础类型和接口老规矩,先定义基础类型和抽象接口。首先我们先定义一个工厂接口Factory,并定义了3个方法,分别是对外公开生成实例的Create()

2021-08-09 23:23:22 464

原创 Golang与设计模式-Template Mode模版模式

模版模式的核心思想就是在弗雷中定义处理流程的框架,在子类种实现具体处理。了解了设计模式的核心思想,那么我们就可以按照这个想法去实现一个事例来演示一下模版模式的使用场景跟方法。场景我们可以模拟一个完成的手机操作流程,从解锁 -> 打开微信发起转账给老婆 -> 支付验证,我们可以对这一系列操作合并在一起叫 微信转账。而IPhone7跟IPhone12的操作是有差别的,我们知道IPhone7是可以用TouchID解锁手机和微信支付验证的,而IPhone12用的是FaceID来完成解锁手机跟

2021-08-08 21:22:46 327

原创 Golang与设计模式-Adapter适配器模式

适配器模式是我们在工作中会经常使用到的模式。比如对接口升级的同时,又要保证对旧借口的兼容。场景生活中我们会遇到这种情况,我们常用的插线板三插孔(10A)与空调插头(16A)的大小不一样,虽然都是三插孔。当我们买了空调,安装时发现空调插头并不能插入我们原有(10A)的插孔时,我们可以买一个插头转换器,如下图。我们可以把10A的反面插头插入我们正常的10A三插孔,再将空调的插头插入正面的16A三插孔即可。这里,我们的插头转换器扮演的就是 适配器(Adapter)的角色。接下来我会以这个插头.

2021-08-08 01:31:04 428

原创 Golang与设计模式-Iterator迭代器模式

迭代器模式在Java和C#中常用到的设计模式,这种模式主要用于对于集合(Aggregate)的有序访问。一般情况下Golang的开发中是不需要使用到的,像Slice跟Array都可以通过for...range...来完成遍历。但不是说一定就用不上哦。接口首先,我们知道迭代器模式主要适用于数据集合,那么我们就可以定义一个集合(Aggregate)接口,这个接口只有一个方法,就是返回给我们一个迭代器(Iterator)。// 集合接口type Aggregate interface { /

2021-08-07 13:44:36 870

原创 Golang的GC垃圾回收机制

Go version1.3,标记清除法(Mark And Sweep)步骤:进行STW(stop the world,暂停程序的业务逻辑),找出不可达的对象和可达的对象 开始标记,程序找出可达内存占用并做标记 清楚未标记的对象,因为未标记的都是不可达的对象 结束STW,程序的业务逻辑继续运行。 整个程序的生命周期内循环执行上述步骤优化:互换第3步与第4步执行顺序,缩小STW影响范围(缩短程序逻辑暂停时间),清楚垃圾动作与程序逻辑并发执行缺点:1. STW(stop the wo

2021-08-06 18:54:37 146

原创 Golang与设计模式-简单工厂模式

我们在实例化对象的时候通常用的是New关键字,但是有了工厂(方法/函数),我们在声明对象的时候就可以用工厂了,用new导致代码不够灵活,用工厂来实例化对象很灵活。定义:简单工厂模式的核心思想就是根据输入不同的参数,返回不同的实例。多种参数多种返回值。事例:比如我们有一个生产IPhone的工厂(工厂构造函数),那么我们告诉工厂我们想要的IPhone的型号(iPhone的版本号以函数参数的形式传入),让其为我们生产(返回实例)。type IPhone interface { Logi.

2021-08-05 22:15:44 177

原创 基于Docker搭建Consul的集群环境

Consul的集群部署很简单,开发环境搭建集群其实一个docker-compose.yml就搞定了。但是实际生产环境除非用k8s,我们手动部署还是得要一步一步来。但是通过Docker实现也非常的简单了。下面是我本地搭建集群的操作方式,且适用于生产环境使用拉取镜像:docker pull consul:1.9.8启动第一个节点docker run -d --name consul-1 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500

2021-08-02 16:04:34 866

原创 常见的二叉树(Binary tree)结构

二叉树(Binary tree)二叉树是一种特殊的树结构,每个结点最多只有两个子树(子节点),即使某结点只有一个子树,也要区分左右子树,左子树和右子树是有顺序的。完全二叉树假设有一个二叉树的深度为n,除了第n层以为,其它各层的结点数都达到最大个数(0~n-1层的节点都是满的),且第n层(最下面一层)的所有结点都连续集中在最左边。满二叉树除根节点意外,每一层上的所有结点都有两个子结点二叉树满二叉树是完全二叉树的特例,因为满二叉树已经满了。二叉排序树(二叉查...

2021-07-28 16:58:54 1651

原创 Golang二叉树的4种遍历方式(先序,中序,后序,层序)

本文只涉及使用Golang实现的(普通)二叉树的先序、中序、后序和层序的递归遍历方式。二叉树树的任意节点至多包含两棵子树。二叉树的遍历二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。题目数据我们以上面的这个二叉树图为基础数据编写代码Code基础结构二叉树需要存储自身节点数据,以及最多两个子节点的索引type BinaryTree struct { Value int

2021-07-28 12:04:15 2764

原创 Golang程序的优雅退出

我们知道,在使用Linux操作系统运行程序时,我们经常会使用 “Kill -9” 和 “Ctrl + C” 的形式退出程序。所以,我们可以在程序中监听来自系统的退出信号,当主函数接收到退出信号时,再退出程序。像这样:func main() { //接收退出信号的chanel sig := make(chan os.Signal) //指定哪些信号可以转发到chanel,如果没有列出,会将所有信号传递到chanel signal.Notify(sig, syscall.SIGINT, sys

2021-07-13 16:57:09 1399

原创 计算机网路协议知识汇总(十一)应用层-DNS与DHCP

应用层常见的应用层协议包括:超文本传输: HTTP、HTTPS文本传输: FTP电子邮件: SMTP、POP3、IMAP动态主机配置: DHCP域名系统: DNSDNS(Domain Name System)域名系统利用DNS协议与DNS服务器通信,将域名解析成对应的IP地址DNS可以基于UDP协议,也可以基于TCP协议,服务器为53端口(DNS协议默认访问服务器的53端口)客户端首先会访问最近的一台DNS服务器(也就是客户端自己配置的DNS服务器)所有的DNS服务器都记录了D

2021-06-25 12:13:16 336 1

原创 计算机网路协议知识汇总(十)传输层-TCP-释放连接(4次挥手)

4次挥手状态分析客户端ESTABLISHED:连接已经建立,可正常接收发送数据,当前状态下可发起连接释放的请求(第1次挥手)服务器ESTABLISHED:连接已经建立,可正常接收发送数据,当前状态下可接收自客户端发起的连接释放请求客户端FIN-WAIT-1:已向服务端发起连接释放(第1次挥手,FIN=1,ACK=1)后的状态,等待服务端的连接释放确认(第2次挥手)服务端CLOSE-WAIT:接收到客户端发起的连接释放请求(第1次挥手)后,且向客户端发起连接释放确认(第2次挥手,ACK=1)后的

2021-06-25 09:31:13 191

原创 计算机网路协议知识汇总(九)传输层-TCP-建立连接(3次握手)

建立连接tcp 是面向连接的,为了实现这个连接双方需要同步一些信息,建立某些数据结构,这些工作在三次握手阶段完成。缩写词SYN:同步信号ACK:确认信号ack:确认号,请求下一次接收到数据的相对位置seq:序号,发送的数据相对位置序号、确认号连续ARQ协议 + 滑动窗口协议(数据传输协议)关注请求里的相对值客户端 -> 服务器。建立请求的数据部分长度为0,只有tcp首部,SYN=1(请求建立连接,seq=s1,s1为原生客户端序号值),ACK=0seq=0(相对

2021-06-25 09:30:13 205

原创 计算机网路协议知识汇总(八)传输层-TCP-流量控制和拥塞控制

流量控制如果接收方的缓存区满了,发送方还在疯狂的发送数据。那么接收方只能把接受到的数据包丢掉,大量的丢包会造成极大的网络资源浪费。所以需要流量控制。什么是流量控制?让发送发的发送速率不要太快,让接收方来得及接受处理。原理:通过确认报文中窗口字段的大小来控制发送发的发送速率发送发的发送窗口大小不能超过接收方给出的窗口大小当发送方收到接收方窗口的大小为0是,发送方就会停止发送数据特殊情况一开始,接收方给发送方发送了窗口值为0的报文段。后面,接收方有了缓存空间,给发送方发了窗口值不为0

2021-06-25 09:28:21 645

原创 计算机网路协议知识汇总(七)传输层-TCP-可靠传输

可靠传输ARQ(Automatic Repeat-reQuest),自动重传请求基于停止等待协议连续ARQ协议 + 滑动窗口协议SACK(Selective Acknowledgment,选择性确认)告诉发送方,那些数据丢失,那些数据确认收到避免重传时有太多重复数据,提高TCP性能如果请求包含SACK选项,SACK信息位于TCP首部可选部分Kind=5,表示SACK选项,占8位Length:占8位,表示SACK信息一共占用多少字节。Left Edge:占32位,左边界。已经

2021-06-25 09:24:22 160

原创 计算机网路协议知识汇总(六)传输层-TCP

TCP(Transmission Control Protocol),传输控制协议可靠传输流量控制拥塞控制数据格式TCP报文段 = 首部 + 数据部分首部首部 = 源端口(16位) + 目标端口(16位) + 序号 + 确认号 + 数据偏移(4位) + 保留(6位) + URG + ACK + PSH + RST + SYN + FIN + 窗口 + 检验和 + 紧急指针 + 选项 + 填充数据偏移作用:计算首部长度,也代表数据部分在整个报文段的起始位置占4位,取值范围:0x01

2021-06-25 09:22:44 178

原创 计算机网路协议知识汇总(五)传输层-UDP

UDP(User Datagram Protocol),用户数据报协议无连接,减少了建立和释放连接的开销不可靠传输,尽最大能力交付因此不需要维护一些复杂的参数,首部只有8个字节(TCP首部最少要20字节)数据段 = 首部 + 数据部分首部首部(8个字节) = 源端口号(16位) + 目标端口号(16位) + UDP长度(16位) + UDP检验和(16位)UDP长度表示数据段的总长度UDP检验和检验和 = 伪首部 + 首部 + 数据伪首部(12个字节) = 源IP地址(4字.

2021-06-25 09:20:14 131

原创 计算机网路协议知识汇总(四)网络层

网络层(Network)数据单位:IP数据包,包(Package)数据包 = 网络层首部 + 数据部分数据部分一般由传输层传下来的数据段(Segment)首部首部 = 固定部分(20字节)+ 可变部分版本(Version)占4位0b0100:IPV40b0110:IPV6首部长度(Header Length)占4位,长度值乘以4才是最终长度0b0101:5,5*4=20字节(最小值)0b1111:15,15*4=60字节(最大值)区分服务(Qos,Quality of

2021-06-25 09:19:29 309 1

原创 计算机网络协议知识汇总(三)数据链路层

数据链路层(DataLink)数据单位:帧(Frame)链路:从一个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点。数据链路:在一条链路上传输数据是,需要有对应的通信协议来控制数据的传输不同类型的数据链路,所用的通信协议可能是不同的1.广播信道:CSMA/CD协议2.点对点信道:PPP协议封装成帧数据帧 = 帧尾部+ 数据部分(IP数据包,网络层传递下来的数据包) + 帧首部数据部分的长度小于MTU(最大传输单元)每一种数据链路层协议都规定了所能够传输的帧的数据

2021-06-24 14:55:12 1561 1

原创 计算机网络协议知识汇总(二)物理层

物理层(physical )物理层定义了网络接口标准、线缆标准、传输速率、传输方式等Analog Signal 模拟信号连续的信号,适合长距离传输抗干扰能力差,受到干扰时波形变形很难纠正广域网通信,调制解调器与调制解调器之间时模拟信号。当代组网已经大规模是使用光电转换器传输光电信号通信。Digital Signal 数字信号离散的信号,不适合长距离传输抗干扰能力强,受到干扰时波形失真可以修复局域网内组网是数字信号通信,网线不能超过100米。信道 Channel信号传输的通道

2021-06-24 14:52:21 216

原创 计算机网络协议知识汇总(一)

OSI网络模型1985年国际化标准组织ISO定义了OSI 7层网络互联模型。(物理层、数据链路层、网络层、运输层、会话层、表示层、应用层)学习时期我们按照5层模型学习。(物理层、数据链路层、网络层、运输层、应用层)会话层、表示层、应用层可视为 应用层。ping先根据IP地址将数据到路由。在路由解析目标网卡MAC地址,发送到指定网卡。PING 使用的是ICMP协议(Internet Control Message Protocol Internet控制报文协议)。ARP协

2021-06-24 14:51:12 182

原创 记一次Docker时区问题和解决办法

1.确认问题使用命令查看容器时间docker exec -it <容器ID> date像这样

2021-05-28 18:03:43 218

原创 Golang小菜-interface的坑

Golang小菜-interface的坑先看题package mainimport ( "fmt" "reflect")func main() { var data *byte var in interface{} fmt.Println(data, data == nil) fmt.Println(in, in == nil) in = data fmt.Println(in, in == nil)}小伙伴们先猜猜这段代码的输出是什么吧,我们先分析,再看答案!

2021-05-07 11:14:17 249 1

ERC20Token.sol

可部署于以太坊和所有支持solidity ^0.5.17版本的智能合约的区块链平台,ERC20 token合约代码,包含合约暂停,账户冻结,增发,销毁等功能

2020-08-03

MinGW-w64 - for 32 and 64 bit Windows

MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。

2020-07-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除