智能合约
接触区块链的,经常会听到智能合约这个词,那什么是智能合约?今天就来了解了解。
比特币引领区块链,以太坊复活智能合约1994 年,计算机科学家和密码学家 Nick Szabo 首次提出“智能合约”概念,它早于区块链概念的诞生,几乎与互联网同龄。
Szabo 描述了什么是“以数字形式指定的一系列承诺,包括各方履行这些承诺的协议”。虽然有它的好处,但智能合约的想法一直未取得进展——一个重要原因是因为缺乏能够支持可编程合约的数字系统和技术。
直到 2008 年,第一个加密货币比特币出现,同时引入了现代区块链技术。区块链最初是以比特币的底层技术出现的,但是智能合约在 2008 年依然无法融入比特币区块链网络。五年后,以太坊创始人 Vitalik Buterin 发布了白皮书《以太坊:下一代智能合约和去中心化应用平台》, 作为首个支持“图灵完备”智能合约的区块链网络,以太坊掀开了以智能合约为代表的区块链 2.0 时代的序章。从此,涌现出了各种不同形式的智能合约,其中以太坊智能合约使用最广。
智能合约是什么
智能合约是一种特殊协议,旨在提供、验证及执行合约。
智能合约的英文是 Smart Co ...
编译器对代码做了哪些工作
知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。
计算机很笨,它只认识 0 和 1,也只会运行最简单的机器指令,而我们平时写的代码大多都属于高级语言。高级语言编写的指令要想在计算机上执行,需要将高级语言转换成计算机识别的机器语言。编译器就是将高级语言转换成机器语言的一款软件。
一个完整的编译器将源码编译成目标机器指令主要包含以下几个步骤。
词法分析词法分析从左到右扫描源程序的字符,识别出每个单词,并组成词素(源代码中的一个字符串,比如一个变量名,一个运算符,都会被识别为一个词素。)。对于每个词素,词法分析会把它解析成一个词法单元。这个词法单元被称为 Token。Token 的形式一般为
1〈token-name, attribute-value〉
token-name: 单词的类别
程序中的单词大体可以分成五类:
attribute-value: 指向符号表中关于这个词法单元的条目。符号表条目的信息会被语义分析和代码生成步骤使用
什么是符号表?
编译器的重要功能之一是记录源程序中使用的变量的名字,并收集和每个名字的各种属性有关的信息。这些属性可以提供 ...
Java8中的Stream流
定义什么是Stream流,Java doc中是这样写的
A sequence of elements supporting sequential and parallel aggregate operations
翻译一下就是一个支持顺序和并行聚合操作的元素序列。可以把它理解成一个迭代器,但是只能遍历一次,就像是流水一样,要处理的元素在流中传输,并且可以在流中设置多个处理节点,元素在经过每个节点后会被节点的逻辑所处理。比如可以进行过滤、排序、转换等操作。
Stream流的使用可以分为三个步骤:
数据源,创建流
中间操作,可以有多个,生成一个新的流
终端操作,只能有一个,放在最后,代表流中止。
Stream流有几个特点:1、Stream流一般不会改变数据源,只会生成一个新的数据流。2、Stream流不会存储数据,只会根据设置的操作节点处理数据。3、Stream流是延迟执行的,只有在调用终端操作后才会进行流转。
看一下Stream的结构
使用数据源生成流
如果是集合的话,可以直接使用stream()创建流。
如果是数组的话,可以使用Arrays.stream()或Stream.of ...
区块链的灵魂-共识机制
区块链是去中心化、分布式的,每个人都可以自由的参与进来,共同处理区块链中的数据。所谓绝对的自由必然带来绝对的混乱,作为一个巨大的分布式计算网络,必然有一个绕不开的问题–拜占庭将军问题
拜占庭将军问题拜占庭将军问题(Byzantine failures),是由计算机科学史上的传奇人物莱斯利·兰伯特(Leslie Lamport)提出的。
拜占庭帝国派出10个将军去攻击敌人,这支敌人可以同时抵御5支拜占庭军队的同时袭击。而这10个拜占庭将军在分开的状态下包围了敌人,并且只能依靠通信兵骑马相互通信来协商进攻意向及进攻时间。但是这些将军们不能确定他们的通信兵中是否有叛徒,叛徒可能擅自改变进攻意向及进攻时间。在这种情况下怎样才能保证同时有多于5支军队攻击,来赢得胜利?
放到区块链中,拜占庭将军问题主要针对点对点通信中的分布式系统一致性问题。可以简单的概括为为 在整个网络中的任意节点都无法信任与之通信的对方时,如何能创造出共识基础来进行安全信息的交互而无需担心数据被篡改。
区块链四大核心技术之一的共识机制就是为了解决这个问题。
什么是共识机制?共识,对特定事务具有相同的认识或态度。 共识在我们的 ...
认识区块链和web3.0
2017-2018年期间,伴随着比特币的又一轮牛市,第一次认识和了解了区块链。2019年,高层大佬们集体学习区块链,也跟着重新关注起了区块链。也是因为区块链,去年第一次接触到了Web3.0,给我的第一印象是这东西太过超前了,如果真的能落地,那真的又是一场技术革命了,从那以后陆陆续续的关注着。今年下半年换了份工作,发现公司做区块链的大牛也在关注Web3.0,也跟着学习长进了不少。这篇文章主要介绍一些区块链和Web3.0的基本知识,可以对区块链和Web3.0有个大概的了解。
区块链
2008年,全球金融危机,全世界掀起了反思传统金融制度的思潮,一个叫中本聪的人在P2P foundation网站上发布了比特币白皮书《比特币:一种点对点的电子现金系统》。
在书里提出了一种无须可信第三方的电子支付系统——比特币,通过整合非对称加密技术、工作量证明机制(Proof of Work,简称PoW)、点对点技术(Peer-to-Peer,简称P2P)等来保障个人对资产的所有权和匿名性,彻底颠覆了对于货币需要依赖中心化机构发行的传统认知。
区块链和比特币由此诞生,那区块链到底是什么呢?。可以把区块链理解 ...
Java类加载器
类加载器我们写的每一个Java文件,首先通过编译器编译成class文件,然后经过类加载器加载到jdk运行时内存中生成一个class类,才会被程序使用。而类加载器就是加载字节码(.class)文件的类–java.lang.ClassLoader。
类加载器的分类Java默认设置了三个类加载器。
BootstrapClassloader
ExtClassloader
AppClassloader
BootstrapClassloader 叫做启用类加载器,用于加载JRE核心类库,使用C++实现。加载路径%JAVA_HOME%/lib下的所有类库。
ExtClassloader 扩展类加载器,加载%JAVA_HOME%/lib/ext中的所有类库。
AppClassloader 应用类加载器也叫系统类加载器System Classloader,加载%CLASSPATH%路径下的所有类库。
Java 也提供了扩展,可以让我们自己实现类加载的功能。类加载器在Java中是java.lang.ClassLoader这个类,如果要自定义类加载器,只要实现这个类,重写加载方法就好了。
在 ...
Java工具 Jstack 的使用
jstack - Prints Java thread stack traces for a Java process, core file, or remote debug server.
Jstack主要的作用是生成当前进程中所有线程的信息,也就是当前时刻JVM的线程快照,通过线程的信息我们可以定位到程序中出现长时间停顿、CPU占用率过高等问题。
线程快照中的信息是当前java虚拟机内每一条线程正在执行的方法的堆栈集合,有了堆栈信息我们就可以分析出我们的程序问题出现在哪,比如线程间死锁、外部资源请求时间过长、死循环等。
使用:
123456789101112131415161718jstack [ options ] pidjstack [ options ] executable corejstack [ options ] [ server-id@ ] remote-hostname-or-IPOPTIONS -F Force a stack dump when jstack [-l] pid does not respond. ...
ThreadLocal 内存泄露问题
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 ——百度百科
上述的意思用在java中就是存在已经没有任何引用的对象,但是GC又不能把对象所在的内存回收掉,所以就造成了内存泄漏。
ThreadLocal主要解决的是对象不能被多个线程同时访问的问题。根据ThreadLocal的源码看看它是怎么实现的。
ThreadLocal设置数据的set()方法
12345678910111213141516public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) ...
Spring Boot 打包成Jar包运行的原理
相比于传统的Java打包方式,使用SpringBoot打包插件打包成jar包后,可以直接使用java -jar 运行SpringBoot项目,本篇就来分析一下运行的原理。
SpringBoot打包插件
1234<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId></plugin>
打包完后会生成两个文件,一个***.jar和***.jar.original
.jar文件是SpringBoot打包后生成的文件,.jar.original是用原生方式打包生成的文件,对比一下两个的区别
.jar.original文件
.jar文件
.jar.original就是普通的jar打包的结构,这里主要看.jar文件的结构:
META-INFO目录:META-INFO/MANIFEST.MF里包含了jar包的元数据,包含了项目的启动类等信息.
org目录: ...
设计一个支持热加载的Java应用启动器
热加载是指在不重启服务的情况下使更改的代码生效。注意和热部署的区别,热加载主要是在开发环境下使用。
首先要知道Java程序是怎么运行起来的,Java类加载分为其7个阶段。
其中加载阶段是用户可以自定义,而验证阶段、准备阶段、解析阶段、初始化阶段都是用 JVM 来处理的。整个类加载是在Java 中一个叫做类加载器上进行的,如果我们能程序更改后,让程序所在的进程能够实时的获取到编译后的Class类字节码信息,然后重新加载的话,那么就可以实现热加载功能。
Java 类加载器类加载器,顾名思义就是加载Java类的工具,Java默认设置了三个类加载器。
BootstrapClassloader
ExtClassloader
AppClassloader
BootstrapClassloader 叫做启用类加载器,用于加载JRE核心类库,使用C++实现。加载路径%JAVA_HOME%/lib下的所有类库。
ExtClassloader 扩展类加载器,加载%JAVA_HOME%/lib/ext中的所有类库。
AppClassloader 应用类加载器也叫系统类加载器System C ...