2021-2-17 1252 0
2021-2-2 1276 0
区块链学习

一、共识相关1、POW共识工作量证明,按劳分配,算力决定一切,谁的算力多,谁记账的概率就越大。具体:找到一个hash值SHA256(SHA256(Block_Header)),使得新区块头的哈希值小于某一个指定的值,即区块头中的“难度目标”。找到之后,会全网进行广播打包的区块进行验证,验证通过,该区块会被接受,从而记录到账本中。2、POS共识股权证明,根据用户持有货币的多少和时间(币龄),发放利息的制度。纯POS机制的加密货币,只能通过IPO的方式发行,这就导致“少数人”获得大量成本极低的加密货币。信用基础并不牢固。出块方式是通过随机数。3、DPOS权益持有者选举任何数量的见证人来生成区块,类似人民代表大会制度。即将POS中多有可记账改为只有选举出的见证者才可以记账。优点是交易确认时间短。二、HyperLedgerFabric共识算法1、solo模式单一order节点出块2、kafka模式3、拜占庭容错三、Hyperledger工作流程Fabric基本的流程包括四个阶段,分别是模拟(simulate)、排序(order)、验证(validata)、提交(commit)模拟如其名字所说的一样,这一阶段只是模拟进行交易,并不真正更新ledger。client发起交易请求,请求被发送至endorsers(endorsementpeer,这些peer是根据endorsementpolicy选出来的),endorsers根据当前本地的ledger状态并行模拟进行这些交易,虽然不改变ledger状态,但是会产生一个readset和一个writeset记录这个交易的影响,模拟完成后,endorser对readset和writeset进行签名并将其一起返回给client。如果client收到的readset和writeset是一致的(可能存在恶意endorser或者智能合约存在不确定的算法导致出现不一致),那么client就会生成一个真正的交易请求,包含readset、writeset和对应的签名,并将这个请求发送给orderingservice。排序orderingservice对来自client的交易进行排序,需要注意的是这里并不检查交易的内容,默认按照交易到达的顺序进行排序(这种简单的排序可能导致大量的交易冲突,降低性能,如果按某一特定的顺序排序可以极大的较少交易冲突,提高吞吐量,这也是这篇论文提出的最重要的工作,这里就不细说)。orderingservice将交易排序后打包成block,发送给网络中的peers,这里不保证所有的peer同时收到这个block,但保证收到的block的顺序是一致的(使用gossip协议)。验证当peer收到block后,就开始验证阶段。验证阶段主要包括两个检查:EndorsementPolicy检查检查交易是否满足endorsementpolicy以及是否包含有效的签名,否则说明交易可能被client或者恶意peer篡改过,直接丢弃。交易冲突检查检查交易之间是否存在冲突,也就是是否读脏数据的问题(某个交易在读取ledger之前,ledger被前一个交易改变了),如果存在就丢弃该交易。两次检查都通过的话就可以进入commit阶段了。提交peer将block添加到链上,注意这里是所有的交易(有效的和无效的)都加进来了。然后根据有效的交易改变当前的ledger状态。参考链接https://blog.csdn.net/yijiull/article/details/94966044

2021-1-28 1754 0
编程语言

本文代码托管于githubcmake_democmake中一些预定义变量PROJECT_SOURCE_DIR工程的根目录PROJECT_BINARY_DIR运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/buildCMAKE_INCLUDE_PATH环境变量,非cmake变量CMAKE_LIBRARY_PATH环境变量CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径CMAKE_CURRENT_BINARY_DIRtarget编译目录使用ADD_SURDIRECTORY(srcbin)可以更改此变量的值SET(EXECUTABLE_OUTPUT_PATH<新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径CMAKE_CURRENT_LIST_FILE输出调用这个变量的CMakeLists.txt的完整路径CMAKE_CURRENT_LIST_LINE输出这个变量所在的行CMAKE_MODULE_PATH定义自己的cmake模块所在的路径SET(CMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块EXECUTABLE_OUTPUT_PATH重新定义目标二进制可执行文件的存放位置LIBRARY_OUTPUT_PATH重新定义目标链接库文件的存放位置PROJECT_NAME返回通过PROJECT指令定义的项目名称CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS用来控制IFELSE语句的书写方式系统信息CMAKE_MAJOR_VERSIONcmake主版本号,如2.8.6中的2CMAKE_MINOR_VERSIONcmake次版本号,如2.8.6中的8CMAKE_PATCH_VERSIONcmake补丁等级,如2.8.6中的6CMAKE_SYSTEM系统名称,例如Linux-2.6.22CAMKE_SYSTEM_NAME不包含版本的系统名,如LinuxCMAKE_SYSTEM_VERSION系统版本,如2.6.22CMAKE_SYSTEM_PROCESSOR处理器名称,如i686UNIX在所有的类UNIX平台为TRUE,包括OSX和cygwinWIN32在所有的win32平台为TRUE,包括cygwin开关选项BUILD_SHARED_LIBS控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库(可在t3中稍加修改进行验证)CMAKE_C_FLAGS设置C编译选项CMAKE_CXX_FLAGS设置C++编译选项cmake常用命令基本语法规则:cmake变量使用${}方式取值,但是在IF控制语句中是直接使用变量名环境变量使用$ENV{}方式取值,使用SET(ENV{VAR}VALUE)赋值指令(参数1参数2…)参数使用括弧括起,参数之间使用空格或分号分开。以ADD_EXECUTABLE指令为例:ADD_EXECUTABLE(hellomain.cfunc.c)或者ADD_EXECUTABLE(hellomain.c;func.c)指令是大小写无关的,参数和变量是大小写相关的。推荐你全部使用大写指令。部分常用命令列表:PROJECTPROJECT(projectname[CXX][C][Java])指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言SETSET(VAR[VALUE][CACHETYPEDOCSTRING[FORCE]])定义变量(可以定义多个VALUE,如SET(SRC_LISTmain.cutil.creactor.c))MESSAGEMESSAGE([SEND_ERROR|STATUS|FATAL_ERROR]“messagetodisplay”…)向终端输出用户定义的信息或变量的值SEND_ERROR,产生错误,生成过程被跳过STATUS,输出前缀为—的信息FATAL_ERROR,立即终止所有cmake过程ADD_EXECUTABLEADD_EXECUTABLE(bin_file_name${SRC_LIST})生成可执行文件ADD_LIBRARYADD_LIBRARY(libname[SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL]SRC_LIST)生成动态库或静态库SHARED动态库STATIC静态库MODULE在使用dyld的系统有效,若不支持dyld,等同于SHAREDEXCLUDE_FROM_ALL表示该库不会被默认构建SET_TARGET_PROPERTIES设置输出的名称,设置动态库的版本和API版本CMAKE_MINIMUM_REQUIREDCMAKE_MINIMUM_REQUIRED(VERSIONversion_number[FATAL_ERROR])声明CMake的版本要求ADD_SUBDIRECTORYADD_SUBDIRECTORY(src_dir[binary_dir][EXCLUDE_FROM_ALL])向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除SUBDIRSdeprecated,不再推荐使用(hellosample)相当于分别写ADD_SUBDIRECTORY(hello),ADD_SUBDIRECTORY(sample)INCLUDE_DIRECTORIESINCLUDE_DIRECTORIES([AFTER|BEFORE][SYSTEM]dir1dir2…)向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,如果路径包含空格,可以使用双引号将它括起来,默认的行为为追加到当前头文件搜索路径的后面。有如下两种方式可以控制搜索路径添加的位置:CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面通过AFTER或BEFORE参数,也可以控制是追加还是置前LINK_DIRECTORIESLINK_DIRECTORIES(dir1dir2…)添加非标准的共享库搜索路径TARGET_LINK_LIBRARIESTARGET_LINK_LIBRARIES(targetlib1lib2…)为target添加需要链接的共享库ADD_DEFINITIONS向C/C++编译器添加-D定义ADD_DEFINITIONS(-DENABLE_DEBUG-DABC),参数之间用空格分隔ADD_DEPENDENCIESADD_DEPENDENCIES(target-namedepend-target1depend-target2…)定义target依赖的其他target,确保target在构建之前,其依赖的target已经构建完毕AUX_SOURCE_DIRECTORYAUX_SOURCE_DIRECTORY(dirVAR)发现一个目录下所有的源代码文件并将列表存储在一个变量中把当前目录下的所有源码文件名赋给变量DIR_HELLO_SRCSEXEC_PROGRAMEXEC_PROGRAM(Executable[dirwheretorun][ARGS<args>][OUTPUT_VARIABLE<var>][RETURN_VALUE<value>])用于在指定目录运行某个程序(默认为当前CMakeLists.txt所在目录),通过ARGS添加参数,通过OUTPUT_VARIABLE和RETURN_VALUE获取输出和返回值,如下示例#在src中运行ls命令,在src/CMakeLists.txt添加EXEC_PROGRAM(lsARGS"*.c"OUTPUT_VARIABLELS_OUTPUTRETURN_VALUELS_RVALUE)IF(notLS_RVALUE)MESSAGE(STATUS"lsresult:"${LS_OUTPUT})#缩进仅为美观,语法无要求ENDIF(notLS_RVALUE)INCLUDEINCLUDE(file[OPTIONAL])用来载入CMakeLists.txt文件INCLUDE(module[OPTIONAL])用来载入预定义的cmake模块OPTIONAL参数的左右是文件不存在也不会产生错误可以载入一个文件,也可以载入预定义模块(模块会在CMAKE_MODULE_PATH指定的路径进行搜索)载入的内容将在处理到INCLUDE语句时直接执行FIND_FIND_FILE(<VAR>namepath1path2…)VAR变量代表找到的文件全路径,包含文件名FIND_LIBRARY(<VAR>namepath1path2…)VAR变量代表找到的库全路径,包含库文件名FIND_LIBRARY(libXX11/usr/lib)IF(NOTlibx)MESSAGE(FATAL_ERROR"libXnotfound")ENDIF(NOTlibX)FIND_PATH(<VAR>namepath1path2…)VAR变量代表包含这个文件的路径FIND_PROGRAM(<VAR>namepath1path2…)VAR变量代表包含这个程序的全路径FIND_PACKAGE(<name>[major.minor][QUIET][NO_MODULE][[REQUIRED|COMPONENTS][componets…]])用来调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块,你也可以自己定义Find<name>模块,通过SET(CMAKE_MODULE_PATHdir)将其放入工程的某个目录供工程使用IF语法:IF(expression)COMMAND1(ARGS...)COMMAND2(ARGS...)...ELSE(expression)COMMAND1(ARGS...)COMMAND2(ARGS...)...ENDIF(expression)#一定要有ENDIF与IF对应IF(expression),expression不为:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND,为真IF(notexp),与上面相反IF(var1ANDvar2)IF(var1ORvar2)IF(COMMANDcmd)如果cmd确实是命令并可调用,为真IF(EXISTSdir)IF(EXISTSfile)如果目录或文件存在,为真IF(file1IS_NEWER_THANfile2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径IF(IS_DIRECTORYdir)当dir是目录时,为真IF(DEFINEDvar)如果变量被定义,为真IF(varMATCHESregex)此处var可以用var名,也可以用${var}IF(stringMATCHESregex)当给定的变量或者字符串能够匹配正则表达式regex时为真。比如:IF("hello"MATCHES"ell")MESSAGE("true")ENDIF("hello"MATCHES"ell")数字比较表达式IF(variableLESSnumber)IF(stringLESSnumber)IF(variableGREATERnumber)IF(stringGREATERnumber)IF(variableEQUALnumber)IF(stringEQUALnumber)按照字母表顺序进行比较IF(variableSTRLESSstring)IF(stringSTRLESSstring)IF(variableSTRGREATERstring)IF(stringSTRGREATERstring)IF(variableSTREQUALstring)IF(stringSTREQUALstring)一个小例子,用来判断平台差异:IF(WIN32)MESSAGE(STATUS“Thisiswindows.”)ELSE(WIN32)MESSAGE(STATUS“Thisisnotwindows”)ENDIF(WIN32)上述代码用来控制在不同的平台进行不同的控制,但是,阅读起来却并不是那么舒服,ELSE(WIN32)之类的语句很容易引起歧义。可以SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTSON)这时候就可以写成:IF(WIN32)ELSE()ENDIF()配合ELSEIF使用,可能的写法是这样:IF(WIN32)#dosomethingrelatedtoWIN32ELSEIF(UNIX)#dosomethingrelatedtoUNIXELSEIF(APPLE)#dosomethingrelatedtoAPPLEENDIF(WIN32)WHILE语法:WHILE(condition)COMMAND1(ARGS...)COMMAND2(ARGS...)...ENDWHILE(condition)其真假判断条件可以参考IF指令FOREACHFOREACH指令的使用方法有三种形式:列表语法:FOREACH(loop_vararg1arg2...)COMMAND1(ARGS...)COMMAND2(ARGS...)...ENDFOREACH(loop_var)示例:AUX_SOURCE_DIRECTORY(.SRC_LIST)FOREACH(F${SRC_LIST})MESSAGE(${F})ENDFOREACH(F)范围语法:FOREACH(loop_varRANGEtotal)COMMAND1(ARGS...)COMMAND2(ARGS...)...ENDFOREACH(loop_var)示例:从0到total以1为步进FOREACH(VARRANGE10)MESSAGE(${VAR})ENDFOREACH(VAR)输出:012345678910范围和步进语法:FOREACH(loop_varRANGEstartstop[step])COMMAND1(ARGS...)COMMAND2(ARGS...)...ENDFOREACH(loop_var)从start开始到stop结束,以step为步进,注意:直到遇到ENDFOREACH指令,整个语句块才会得到真正的执行。FOREACH(ARANGE5153)MESSAGE(${A})ENDFOREACH(A)输出:581114cmake中如何生成动态库和静态库参考ADD_LIBRARY和SET_TARGET_PROPERTIES用法t3示例cmake中如何使用动态库和静态库(查找库的路径)参考INCLUDE_DIRECTORIES,LINK_DIRECTORIES,TARGET_LINK_LIBRARIES用法t4示例使用动态库或静态库t5示例如何使用cmake预定义的cmake模块(以FindCURL.cmake为例演示)t6示例如何使用自定义的cmake模块(编写了自定义的FindHELLO.cmake)注意读t5和t6的CMakeLists.txt和FindHELLO.cmake中的注释部分cmake中如何指定生成文件的输出路径如上ADD_SUBDIRECTORY的时候指定目标二进制文件输出路径(推荐使用下面这种)使用SET命令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的二进制文件的位置SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)SET(LIBRARY_OUTPUT_PATH${PROJECT_BINARY_DIR}/lib)上面的两条命令通常紧跟ADD_EXECUTABLE和ADD_LIBRARY,与其写在同一个CMakeLists.txt即可cmake中如何增加编译选项使用变量CMAKE_C_FLAGS添加C编译选项使用变量CMAKE_CXX_FLAGS添加C++编译选项使用ADD_DEFINITION添加cmake中如何增加头文件路径参考INCLUDE_DIRECTORIES命令用法cmake中如何在屏幕上打印信息参考MESSAGE用法cmake中如何给变量赋值参考SET和AUX_SOURCE_DIRECTORY用法建议:在Project根目录先建立build,然后在build文件夹内运行cmake..,这样就不会污染源代码,如果不想要这些自动生成的文件了,只要简单的删除build文件夹就可以转载于https://blog.csdn.net/wzzfeitian/article/details/40963457/

2020-8-9 2010 0
2020-7-27 1431 0
区块链学习

1.理解记住最重要的一点,Dokcer实际是宿主机的一个普通的进程,这也是Dokcer与传统虚拟化技术的最大不同。Docker能保证运行环境的一致性,不会出现开发、测试、生产由于环境配置不一致导致的各种问题,一次配置多次运行。使用Docker,可更快地打包、测试以及部署应用程序,并可减少从编写到部署运行代码的周期。rootfs----内核空间是kernel,Linux刚启动时会加载bootfs文件系统,之后bootfs会被卸载掉。用户空间的文件系统是rootfs,包含我们熟悉的/dev,/proc,/bin等目录。对于容器的镜像来说,底层直接用Host的kernel,自己只需要提供rootfs就行了,容器是共享主机的kernel。先简单理解docker的使用过程,它分为镜像构建与容器启动。镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用dockerfile来完成的。容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过dockerrun来运行。而如果涉及多个容器的运行(如服务编排)就可以通过docker-compose来实现,它可以轻松的将多个容器作为service来运行(当然也可仅运行其中的某个),并且提供了scale(服务扩容)的功能。简单总结:1.dockerfile:构建镜像;2.dockerrun:启动容器;3.docker-compose:启动服务;2.安装更新ubuntu的apt源索引sudoapt-getupdate安装包允许apt通过HTTPS使用仓库sudoapt-getinstall\   apt-transport-https\    ca-certificates\   curl\   software-properties-common添加Docker官方GPGkeycurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd-设置Docker稳定版仓库sudoadd-apt-repository\    "deb[arch=amd64]https://download.docker.com/linux/ubuntu\    $(lsb_release-cs)\   stable"添加仓库后,更新apt源索引sudoapt-getupdate安装最新版DockerCE(社区版)sudoapt-getinstalldocker-ce检查DockerCE是否安装正确sudodockerrunhello-world如果终端卡在Unabletofindimage'hello-world:latest'locally位置docker在本地没有找到hello-world镜像,也没有从docker仓库中拉取镜像,出项这个问题的原因:是应为docker服务器再国外,我们在国内无法正常拉取镜像,所以就需要我们为docker设置国内阿里云的镜像加速器;需要修改配置文件/etc/docker/daemon.json如下{"registry-mirrors":["https://alzgoonw.mirror.aliyuncs.com"]}为了避免每次命令都输入sudo,可以设置用户权限,注意执行后须注销重新登录sudousermod-a-Gdocker$USER3.启动与停止安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令#启动dockersudoservicedockerstart#停止dockersudoservicedockerstop#重启dockersudoservicedockerrestart参考文章理解Docker镜像分层

2020-7-14 1871 0