自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 资源 (10)
  • 问答 (1)
  • 收藏
  • 关注

原创 通过例子学TLA+(十五)--时序属性

时序属性Termination最简单的时序属性是Termination,Termination是算法终止的要求,如果算法崩溃或者死锁或者进入一个无限循环,那么久违反了Termination规范。假设有一辆车在过交通灯时,有红灯和绿灯两种选择,绿灯行,红灯停,红绿灯交替亮起。NextColor(c) == CASE c = "red" -> "green" [] c = "green" -> "red" (*--al

2022-02-16 18:08:12 886

原创 通过例子学TLA+(十四)--宏,过程与标签

宏,过程与标签TLA+在多进程之间复用代码,最简单的方法是使用宏和过程。宏宏是通用的代码内联器,格式为nacro Name(var1,...) begin \* stuffend macro;需要注意的是:宏代码是内联的,不能像进程那样独立运行,其实现不能有标签,不能有多重赋值,不能有while循环等。宏定义必须要在算法的define块之后,在process块之前,其调用方式为Name(arg1,…)。过程过程的编写和使用有两个好处:1、过程可以有局部变量,2、可以添加标签,格式如

2022-02-16 09:56:47 423

原创 通过例子学TLA+(十三)--多进程与await

多进程之前使用的例子都是单进程的,现在用多进程来描述多个逻辑同时发生,TLA+中的多进程可以理解为其他高级语言中的多线程。为了方便理解,使用Pluscal语言来描述,TLA+ Toolbox可以将pluscal语言转化为TLA+,基本格式如下:---- MODULE module_name ----\* TLA+ code(* --algorithm algorithm_name \* 固定格式,algorithm_name根据需要填写variables global_variables

2022-02-15 11:42:19 500 2

原创 通过例子学TLA+(十二)-- 函数与实例

函数和实例函数TLA+中除了 数字,字符串,布尔值,模型值 4种基本类型外,还有两种复杂类型,分别为集合和函数。函数构成了所有实用复杂类型的基础。函数的形式看起来跟之前介绍过的操作符是一样的。函数定义的两种方式:Function == [s \in S |-> foo] \* 这里foo可以是任何方程式。注意这里用的是|->,不是:Function[s \in S] == foo 在函数定义中可以使用无限集合,如Doubles == [n \in Nat |-> 2*n

2022-02-13 18:50:00 464 4

原创 通过例子学TLA+(十一)--命题逻辑与实例

命题逻辑与实例逻辑符在之前的例子中已经用过了,主要是 \A ,\E, => 等符号。\EE是"exists"的首字母,意思是存在。当写下 \E x \in S : P(x) 意味着在S中至少存在一个x使得P为真。采用\E 开头的表达式返回值是布尔类型。\E x \in {1,2} : x > 0 为 true\E x \in {} : x > 0 为 false\E 是存在一个满足条件的元素的意思,~\E 则是不存在满足条件的元素\AA的"All"的首字母,当

2022-02-13 08:39:16 674

原创 通过例子学TLA+(十)--集合

集合集合用大括号来表示,如{1,2},对于连续的数字集合有种特殊的表示方式,如 1…3 表示集合{1,2,3}下表是集合的常见操作Operatorexample备注\in1 \in {1,2} 为true 1\in {{1},2}为false在集合为true,不在为false\notin1 \notin {} 为true {1} \notin {{1}}为false与\in相反\subseteq{1,2} \subseteq {1,2,3}是子集为tru

2022-02-11 10:30:49 505

原创 通过例子学TLA+(九)--元组和结构体

元组元组和其他语言中的数组类似,用<<>>表示,不同之处在于TLA+中元组下标是从1开始。x == <<4, 5, 6>>;x[1] + x[2] + x[3] = 15;DOMAIN 操作符可以作用于元组 例如x == <<"hello", "world", "!">>DOMAIN x = {1,2,3} \* DOMAIN x 等价于 1..Len(x)跟元组有关的Module Sequences 已经在之前介绍过

2022-02-10 18:17:40 575

原创 通过例子学TLA+(八)--表达式

表达式在之前的例子中,已经多次用到了表达式,常见的表达式中会用到 大于,小于,等于,不等于等这样条件判断。还有一些其他的用法,比如逻辑连接,IF-ELSE 等逻辑连接逻辑连接在之前的例子中是用过的,主要是 /\ (and) ,/ (or),用来将表达式连接起来,有个点需要注意的是,逻辑连接符是空格敏感的,如果以缩进方式开始连接,则TLA+将其视为前一表达式的子表达式。例如/\ TRUE \/ TRUE/\ FALSE \* 相当于 (TRUE \/ TRUE) /\ FALSE/

2022-02-10 16:21:42 580 2

原创 通过例子学TLA+(七)--操作符

OperatorTLA+中的操作符类似于其他编程语言中的函数或者宏定义,使用 == 来定义,例如Five == 5 \* 无参数时不用加括号Sum(x,y) == x + y SumwithFive(x,y) == Sum(x,y) + Five \* 定义之后就可以随意使用高阶用法根据使用需求,可以在定义中使用其他操作符 来达到类似于其他语言中函数指针的功能。Sum(a,b) == a + bDo(op(_,_),a,b) == op(a,b) \* 注意实际调用的

2022-02-10 15:40:25 516

原创 通过例子学TLA+(六)--标准模块

标准模块使用标准模块有两个原因。首先,当规范使用我们已经熟悉的基本操作符时,它们更容易阅读。其次,工具如TLC可以内置这些标准操作符。目前的内置模块主要有:数字相关的模块Naturals,Integers,Reals,以及Sequences,FiniteSets,Bags数字模块常用的整数和运算符集定义在Naturals、Integers和Reals三个模块中。Naturals Module 定义了以下操作符加+ 减- 乘* 除/ 取余% 小于< 大于> 小于等于<

2022-01-27 17:34:22 649

原创 智能合约将人与人的交互变成了人与机器的交互

数字人民币的可编程性与智能合约农行深圳分行与华为在深圳联合举办数字人民币智能合约成果发布会上联合发布了租赁资金监管领域的创新应用成果,标志着业内基于数字人民币的首个云侧智能合约应用成果落地。该方案中,智能合约由租赁双方约定数字人民币的交付规则并自动支付(如房租支付和押金退回),让数字人民币在使用方面具有便捷性和多样性。这里面涉及到数字人民币与智能合约,先看下两者的定义:数字人民币定义以下是数字人民币白皮书中的定义:数字人民币是人民银行发行的数字形式的法定货币,由指定 运营机构参与运营,以广义账户体系

2022-01-26 09:55:47 12162

原创 通过例子学TLA+(五)--FIFO & Sequences

FIFO本例子是一个先进先出FIFO的Buffer。Sender向Buff发送数据,Buffer接收数据存储在Sequence中,然后,Buffer将Sequence中第一个数据取出发送给Receiver。可以理解为上一例子的复杂应用。TLA+提供了 Sequences module可以直接使用,该module提供了 Append,Tail,Head,Len 等常见接口。\* module使用之前要先ExtendEXTENDS Sequences\* 初始化一个seqVARIABLE qq

2022-01-20 17:36:14 747

原创 通过例子学TLA+(四)-- Send & Rev & Print

Send & Rev稍微复杂点的程序中都会涉及数据的发送与接收,本例子基于发送器Sender与接收器Receiver来实现数据的变更。假设Sender发送一个数据给Receiver,Receiver接收后将确认信息发送给Sender,增加两个状态rdy,ack来表示发送者状态和确认状态,当rdy等于ack时允许sender发送数据,当rdy与ack不一致时则意味着Receiver有数据需要接收,用val来缓存sender发送的数据,Receiver用data来存储缓存的val数据。创建Modul

2022-01-18 12:04:03 595

原创 通过例子学TLA+(三) -- DieHarder

第三个例子DieHarder本例子主要介绍TLA+是如何进行输入的。在上一个例子中,严格限制了big桶为5升,small桶为3升,目标是4升。如果需要将big桶与small桶的大小根据输入不同,则只需要利用CONSTANT来定义big,small桶的大小即可。------------------------------ MODULE DieHarder ------------------------------- EXTENDS NaturalsCONSTANT BIG,SMALL,GOAL

2022-01-14 16:29:34 673

原创 通过例子学TLA+(二) -- DieHard

第二个例子DieHard这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水。在一部老电影DieHard中主角就面临这个问题,这里就将module名命名为DieHard。如果要倒出一个4升容量的水,那这4升水最后一定在5升的桶里。具体实现方式不止一种,这里举一个例子说明倒水的过程:假设5升桶为big,3升桶为small1、装满small桶,将small水倒入big桶中:此时small为0,big为32、装满small桶,将small水倒入big桶中:此时

2022-01-14 10:10:09 559

原创 通过例子学TLA+(一)-- HourClock

前言刚接触TLA+,将学习过程中的理解整理记录下来,用于加深理解和备忘。有对TLA+感兴趣的可以私信我,一起学习。TLA+简介TLA+ 是一门形式规格说明语言(formal specification language),主要用来验证系统的设计和算法的正确性。它可以用来对几乎任何形式的离散系统进行精确的、正式的描述,特别适合于描述异步系统。TLA+提供了一个工具用来编写TLA+,同时提供了语法检查,参数设置,程序运行等功能,该工具就是TLA+ Toolbox,下载路径为:https://github

2022-01-13 10:33:34 1080

原创 有关区块链的一些理解

2021-12-24 17:52:36 10564 1

原创 程序不同操作系统运行提示缺失GLIBC问题的解决方案

问题描述rust代码在Ubuntu系统编译(cargo build --release)后,将编译好的程序放到centos系统上运行提示/lib64/libc.so.6: version `GLIBC_2.18' not found这是由于在Ubuntu系统上编译时链接了共享库libc2.18,但是centos系统上最高版本为2.17。对于这种情况,一般有两种方法。解决方案一种是在centos上安装2.18版本库太麻烦,所以我选择了第二种方法第二种方法是将程序用的库以静态链接方式打包到程序里

2021-04-09 14:19:36 1189 2

原创 记一个rabbitmq启动失败解决方案

问题环境:Ubuntu18.04问题:rabbitmq 安装后无法启动过程如下:安装sudo apt install rabbitmq-server启动sudo /etc/init.d/rabbitmq-server start查看状态sudo /etc/init.d/rabbitmq-server status有问题,状态不是running看看rabbitmq进程不在查看logtail -f /var/log/rabbitmq/startup_log看到进程在

2020-12-17 17:35:05 2215

原创 关于PBFT的备忘

关于PBFT的备忘论文地址:http://pmg.csail.mit.edu/papers/osdi99.pdf1、为什么节点数至少是3f+1在很多关于BFT的共识算法中,都说在拜占庭节点为 f 个的时候,要保证整体的节点数至少要3f+1。在论文中是这么描述的:当有f个节点是故障的时候,至少要有3f+1个节点来保障系统的安全性和活性。需要3f+1个节点是因为在系统中可能存在f个故障节点,而收到的消息中,有f个消息可能是错误的,因此需要收到的消息中有至少f+1个是正确的。因此整个系统至少要保证3f+1个

2020-12-16 19:29:30 315

原创 make docker报错 Temporary failure resolving解决方法

make docker 时执行到命令RUN apt-get update && apt-get install -y netcat && rm -rf /var/cache/apt 时出现以下错误Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease Temporary failure...

2019-12-29 10:53:39 3534 1

原创 默克尔树特点及优缺点

在区块链中,主要使用Merkle 树来进行数据正确性的验证。特点默克尔树是一种树,可以是二叉树,也可以是多叉树。默克尔树叶子节点的value是数据项的内容或者是数据项的哈希值;非叶子节点的value根据其孩子节点的信息,然后按照hash算法计算得出;优点1、快速hash重计算:默克尔树中任何一个叶子节点内容变更,都能够在前一次的基础上,仅仅将被修改的树节点进行哈希重新计算就能够得到一个...

2019-10-17 14:21:53 2457

原创 举例说明 互斥锁,读写锁,自旋锁

互斥锁共享资源的使用是互斥的,即一个线程获得资源的使用权后就会将改资源加锁,使用完后会将其解锁,所以在使用过程中有其它线程想要获取该资源的锁,那么它就会被阻塞陷入睡眠状态,直到该资源被解锁才会别唤醒,如果被阻塞的资源不止一个,那么它们都会被唤醒,但是获得资源使用权的是第一个被唤醒的线程,其它线程又陷入沉睡。举个例子:假如桌子上有一只笔(资源有限),现在有多个人想用这一只笔(出现资源抢占的情况...

2019-10-16 11:35:44 258

原创 solidity基本编译原理介绍与添加新指令

本文目标​ 本文的主要目的 :1、了解solidity的基本编译原理 2、通过示例的方式了解如何添加新的指令,不会涉及到solidity语言的语法讲解。solidity简介​ solidity是智能合约的开发语言,是一种语法类似于javascript的高级语言。合约源码经过编译生成虚拟机代码运行在虚拟机中。​ 开发文档:https://solidity.readthedocs.io/en...

2019-10-10 18:32:41 1394 5

原创 一种去中心化的匿名投票方案

前言​ 投票这个事不管在现实世界还是互联网世界都是很常见的。在现实世界中,大家可以面对面的实名投票,或者使用投票箱混淆投票达到匿名投票的目的。在互联网,为了避免刷票,在投票前,投票应用基本上都会要求获取用户的个人信息, 就算是微信小程序投票,也会获取个人的微信头像,微信id等个人信息。根据这些信息多半能够对应的上谁是谁,因为圈子就这么大。那有没有一种方法像使用投票箱一样达到匿名投票的效果呢?答案...

2019-10-10 14:21:48 1277

原创 基于工作量证明的密钥交换与公钥分发的方法

背景在这个越来越不安全的网络环境中,要想保证两个节点间通信中的数据是安全的,通常需要混合使用公开密钥算法(非对称加密算法)来进行密钥交换,然后使用对称加密算法将数据加密,使用单向散列函数生成数据指纹,使用签名算法生成数据签名,然后一起将加密数据,数据指纹,数据签名一起发送给对方。 这是目前通用的密钥交换的方式,但也有一个无法避免的问题,就是需要第三方来保证公钥的正确性,同时在双方通信之前,都需要...

2019-09-12 10:09:26 274

原创 一种不依赖公开密钥算法的密钥交换(公钥分发)方法

在这个越来越不安全的网络环境中,要想保证两个节点间通信中的数据是安全的,通常需要混合使用公开密钥算法(非对称加密算法)来进行密钥交换,然后使用对称加密算法将数据加密,使用单向散列函数生成数据指纹,使用签名算法生成数据签名,然后一起将加密数据,数据指纹,数据签名一起发送给对方。 本文介绍一种不使用公开密钥算法来进行密钥交换的方法。假设通信双方为A和B, 方法中x为随机数,y为需要交换的n位加密密钥...

2019-08-22 15:25:46 1656

原创 电影中的秘密分割

在看美国大片的时候,电影里在动用核武器时通常需要多位高官依次输入各自手中的密码,才能启动核武器,否则缺失任何一人的密码都会启动不成功。或者由总统一人通过核武器手提箱发送核武器打击命令。​ 在上述场景中可以了解到,总统是掌握了终极密码的,而其他高管则掌握了部分密码并且不知道其他人手中的密码,而且只有多位官员同时拿出自己手中的密码的时候才能恢复出终极密码,这也是为了总统不在的时候,依然...

2019-08-21 17:37:14 629

原创 Ubuntu 安装 gcc 过程

因为编译源码的时候需要用到6.0以上版本的gcc,而Ubuntu自带gcc版本最大为5.4。因此需要重新安装一个高版本的gcc。官方镜像:http://ftp.tsukuba.wide.ad.jp/software/gcc/release从上述镜像中下载gcc6.5版本源码gcc-6.5.0.tar.gz解压tar -xvzf gcc-6.5.0.tar.gzcd gcc-6.5.0下...

2019-07-24 17:57:44 2144

原创 减少新节点数据全同步花费时间的方法总结

背景对于任何一条区块链来说,随着运行时间的增长,数据量的增加是不可避免的一件事。那对于新加入的节点来说,需要同步的历史数据就会越来越多,同步数据花费的时间也会越来越长。这对于节点参与的积极性是有着不利的影响的。本文主要讨论能够减少新节点数据全同步花费时间的几种方法(目前主网全同步数据需要2天时间)。同步的耗时因素讨论具体方法之前,先考虑下同步数据时花费时间的具体耗时因素。数据量 : 数据总...

2019-06-13 16:22:31 699 2

原创 将区块链节点的RPC访问协议由HTTP修改为HTTPS

目标目前DAPP应用对同步节点的访问都是通过http协议进行的,为了提高RPC接口访问的安全性,可以考虑将HTTP协议替换为HTTPS协议。本文的主要目的是介绍如何将RPC的访问协议由HTTP修改为HTTPS。准备工作本文测试用例以高性能区块链项目HPB为例。1、下载代码:代码路径 https://github.com/hpb-project/go-hpb ,2、安装openssl : ...

2019-06-13 16:18:58 949

原创 Go 将复杂结构体struct转换为字符串string的简单例子

以下是一个将复杂结构体转化为字符串的简单例子package mainimport ( "encoding/json" "fmt")type student struct { name string age int}type grade struct { id int students []student}func main() { //以下是定义...

2019-05-24 14:47:20 25047 2

原创 降低区块链节点存储占用的方法总结

降低存储占用的方法总结​ 随着区块链的不断运行,产生的数据越来越多,占用的存储也就越来越多。在这一点上,对于任何区块链项目都是一样的。在传统的中心化项目里,可以通过删除历史数据而降低对存储占用,保证在业务稳定的情况下,对存储的占用是稳定的, 对于区块链而言,历史数据是对新数据可信的证明,是不能随意删除的,这也就意味着存储占用只能是不断的增加,所以存储问题将是所有区块链项目面临的一个重大问题。本文...

2019-05-18 10:11:00 4135

原创 账户越安全,数据越隐私?NO!

  从PC时代到互联网时代,再到移动互联网时代,账户体系已经成了各个网站,APP的一个标准功能,也是衡量产品用户数的标准!哪家产品要是没有账户功能,估计都不好意思跟人打招呼。下载一个新的APP,打开主页面,首先就是账户注册,填写手机号,验证码,个人邮箱等信息获得一个站内账户。然后有些产品号称为了用户的账户资产安全,需要进行身份证号验证,并手持身份证拍照,面部识别。商家为了获取到用户个人信息真是用尽...

2019-05-04 17:04:46 657

原创 用隐私保护账户安全?NO!

从PC时代到互联网时代,再到移动互联网时代,账户体系已经成了各个网站,APP的一个标准功能,也是衡量产品用户数的标准!哪家产品要是没有账户功能,估计都不好意思跟人打招呼。下载一个新的APP,打开主页面,首先就是账户注册,填写手机号,验证码,个人邮箱等信息获得一个站内账户。然后有些产品号称为了用户的账户资产安全,需要进行身份证号验证,并手持身份证拍照,面部识别。商家为了获取到用户个人...

2019-05-04 16:58:56 5074 2

原创 solidity编译逻辑与添加新指令介绍

本文目标​ 本文的主要目的 :1、了解solidity的基本编译原理 2、通过示例的方式了解如何添加新的指令,不会涉及到solidity语言的语法讲解。solidity简介​ solidity是智能合约的开发语言,是一种语法类似于javascript的高级语言。合约源码经过编译生成虚拟机代码运行在虚拟机中。​ 开发文档:https://solidity.readthedocs.io/en...

2019-04-25 18:58:07 847 6

原创 账号状态存储在MPT中的应用

关于MPT,这篇文章已经有很详细的介绍了:https://ethfans.org/posts/merkle-patricia-tree-in-detail。 所以本文不聊MPT的相关内容,只聊聊账号在MPT中是怎么存储的。World State,也就是世界状态,主要就是用来存储账户的状态的。可以根据块号查询某个账户的历史信息(余额,交易数),也可以通过最新块号查询很久都没有交易的账户信息都是通过...

2019-04-02 09:40:45 394

原创 快速同步之块数据处理源码解析(四)

前文介绍了快速同步的header与body的同步流程,此时在resultCache中已经了完整的block数据。接下来看看要如何处理block,即是如何将block插入到链中。同时也可以了解下快速同步与全量同步的区别。func (this *fastSync) processFastSyncContent(latest *types.Header) error {​ stateSync ...

2019-03-26 19:30:51 306

原创 快速同步之body同步与数据处理源码解析(三)

前文header的处理触发了body的同步,即insertheaderchain成功后,触发了bodywakech事件,这里看看body的同步与处理是怎样的,入口函数是fetchBodies,注意函数内定义的几个函数func (this *fastSync) fetchBodies(from uint64) error {log.Debug(“fast syncing block bodies...

2019-03-26 19:29:31 353

原创 快速同步之header数据处理源码解析(二)

前文介绍了header是如何同步下来的,本文继续介绍同步下来的header是如何处理的。前文介绍header同步的时候有个fetchParts函数,当header数据同步下来后,会触发deliveryCh事件,执行deliver(packet)操作。deliver的定义如下deliver = func(packet dataPack) (int, error) {pack := packet...

2019-03-26 19:28:09 857

深入浅出以太坊

深入浅出以太坊。 介绍了以太坊的相关概念,账户管理,公有链,联盟链,私有链的区别。如何搭建私有链和部署智能合约。

2018-09-17

数据库系统管理与维护

数据库系统管理与维护 耿建玲 管理 维护 数据库

2012-05-06

2006年下半年软件设计师真题分析与解答

2006年软件设计师下半年真题与答案解析 软考

2011-05-26

2008年软件设计师全年真题与答案解析

2008年软件设计师全年真题与答案解析 软件设计师

2011-05-26

2009年软件设计师全年真题与答案解析

2009年软件设计师全年真题与答案解析 软件设计师

2011-05-26

2010年软件设计师全年真题

2010年软件设计师全年真题 软考 软件设计师

2011-05-26

2007年软件设计师全年真题与答案解析

2007年软件设计师全年真题与答案解析 软考

2011-05-26

2006年软件设计师全年真题与答案解析

2005年软件设计师全年真题与答案解析 软件设计师

2011-05-26

2005年软件设计师全年真题与答案解析

软件设计师真题 2005年软件设计师全年真题与答案解析

2011-05-26

汇编语言程序设计 汇编 程序设计

汇编语言程序设计课件,适用初学者参考学习。是著名大学课件。

2010-12-14

空空如也

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

TA关注的人

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