-
2021-02-27 18:47:11
网络信息安全五大特性:①完整性、②保密性、③可用性、④不可否认性、⑤可控性,综合起来说就是保障电子信息的有效性。
1. 完整性:指信息在传输、交换、存储和处理过程保持非修改、非破坏和非丢失的特性,即保持信息原样性,使信息能正确生成、存储、传输,这是最基本的安全特征。
1.1 完整性实现
数据完整性保护有两种基本方法:一是访问控制方法,限制非授权实体修改被保护的数据;二是损坏-检测方法,这种方法无法避免数据损坏,但能确保这些损坏能够被检测出来,并能够被纠正或报警。一般通过消息鉴别码 (MAC)或数字签名机制来实现完整性保护。在确认杂凑值无法被修改时,也可以采用单纯的杂凑算法保护数据的完整性。例如,用于系统镜像完整性保护的杂凑值往往被存储在可信计算模块或一次性编程ROM中。
2. 保密性:指信息按给定要求不泄漏给非授权的个人、实体,即杜绝有用信息泄漏给非授权个人或实体,强调有用信息只被授权对象使用的特征。
2.1 保密性实现
实现保密性保护有三种基本方法:一是访问控制方法,防止敌人访问敏感信息;二是信息隐藏的方法,避免敌人发现敏感信息的存在;三是信息加密的方法,允许敌人观测到信息的表示,但是无法从表示中得到原始的信息内容或提炼出有用的信息。
3. 可用性:指网络信息可被授权实体正确访问,并按要求能正常使用或在非正常情况下能恢复使用的特征,即在系统运行时能正确存取所需信息,当系统遭受攻击或破坏时,能迅速恢复并能投入使用。可用性是衡量网络信息系统面向用户的一种安全性能(使信息能够按照用户的要求被正常使用)。
3.1 可用性实现
实现可用性保护的基本方法一是冗余,二是备份。
4. 不可否认性:指通信双方在信息交互过程中,确信参与者本身,以及参与者所提供的信息的真实同一性,即所有参与者都不可能否认或抵赖本人的真实身份,以及提供信息的原样性和完成的操作与承诺。
4.1 不可否认性实现
使用不可否认功能,虽然不能防止通信参与方否认通信交换行为的发生,但是能在产生纠纷时提供可信证据,有利于纠纷解决。网络环境中的不可否认可以分为起源的不可否认和传递的不可否认,主要通过数字签名技术实现。
5. 可控性:指对流通在网络系统中的信息传播及具体内容能够实现有效控制的特性,即网络系统中的任何信息要在一定传输范围和存放空间内可控。
5.1 可控性实现
除了采用常规的传播站点和传播内容监控这种形式外,最典型的如密码的托管政策,当加密算法交由第三方管理时,必须严格按规定可控执行。
更多相关内容 -
PostgreSQL 14 版本发布,快来看看有哪些新特性!
2021-05-22 22:12:21PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本。本文介绍了该版本中的主要新特性和增强功能,包括性能、新的 multirange 类型、SQL 语句、管理、复制和恢复、安全以及其他方面。
大家好!我是只谈技术不剪发的 Tony 老师。
PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本,目前已经提供了下载。虽然细节可能会有所改变,但是该版本包含了 PostgreSQL 14 最终正式版中所有新特性的预览,让我们赶紧一睹为快吧!
性能增强
PostgreSQL 14 继续了最近几个版本对各种负载情况下的性能优化。该版本针对大量数据库连接时的事务吞吐量有了极大的改进,无论事务处于活动还是空闲状态。
PostgreSQL 14 进一步减少了 B-树索引的资源消耗,包括频繁更新索引导致的表膨胀。GiST 索引可以在构建过程中预先排序数据,能够更快地创建索引并减少索引大小。SP-GiST 索引支持覆盖索引,可以使用 INCLUDE 子句为索引增加不可搜索的额外字段。
PostgreSQL 14 增加了许多并行查询功能。除了对并行顺序扫描的整体性能提升之外,PL/pgSQL 中的 RETURN QUERY 指定现在可以并行执行,REFRESH MATERIALIZED VIEW 命令也可以使用并行查询。
PostgreSQL 14 还增加了使用 FDW 查询远程数据库时的并行执行功能。对于 PostgreSQL 外部数据封装器 postgres_fdw,当设置了 async_capable 标识时可以使用并行查询。postgres_fdw 还支持批量插入,使用 IMPORT FOREIGN SCHEMA 命令导入表分区,以及外部表上的 TRUNCATE 命令。
该版本还改进了分区系统,包括更新或删除数据行影响很少分区时的性能提升。PostgreSQL 14 可以使用 ALTER TABLE … DETACH PARTITION … CONCURRENTLY 命令以非阻塞的方式卸载分区。
上个版本引入的增量排序功能在 PostgreSQL 14 中可以用于窗口函数。该版本增强了扩展统计的范围,可以支持表达式的扩展统计。
几十年来,PostgreSQL 一直支持“超大字段”的压缩存储(TOAST 技术),新版本增加了使用 LZ4 算法压缩字段的功能。
数据类型和 SQL
PostgreSQL 14 基于已有的 range 类型支持增加了新的 multirange 类型,允许用户定义非连续范围的有序列表,例如:
SELECT datemultirange( daterange('2021-07-01', '2021-07-31'), daterange('2021-09-01', '2021-09-30'), daterange('2021-11-01', '2021-11-30'), daterange('2022-01-01', '2022-01-31'), daterange('2022-03-01', '2022-04-07') ); datemultirange | -------------------------------------------------------------------------------------------------------------------------+ {[2021-07-01,2021-07-31),[2021-09-01,2021-09-30),[2021-11-01,2021-11-30),[2022-01-01,2022-01-31),[2022-03-01,2022-04-07)}|
新的 multirange 类型支持所有和 range 类型相关的操作。
PostgreSQL 14 为嵌套对象增加了一个新的通用下标访问方法。例如,用户可以使用以下下标访问的方法获取 JSONB 数据中的元素:
SELECT ('{ "this": { "now": { "works": "in postgres 14!" }}}'::jsonb)['this']['now']['works']; jsonb | -----------------+ "in postgres 14!"|
PostgreSQL 14 支持存储过程的 OUT 参数,以及允许在 GROUP BY 子句中使用 DISTINCT 关键字删除 GROUPING SET 组合中的重复分组。
对于通用表表达式(WITH 子句),PostgreSQL 14 增加了 SEARCH 和 CYCLE 选项,分别用于指定搜索顺序和循环检测。
PostgreSQL 14 还增加了新的 date_bin 函数, 可以用于将时间戳按照指定的间隔进行对齐(一种称为“装箱”的技术)。例如:
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01'); date_bin | -------------------+ 2020-02-11 15:30:00| SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01 00:02:30'); date_bin | -------------------+ 2020-02-11 15:32:30|
管理功能
PostgreSQL 14 针对 VACUUM 命令进行了许多改进,包括索引的优化。Autovacuum 现在可以分析分区表,并且能够将数据行的统计信息关联到父表。另外,通过调整 maintenance_io_concurrency 参数可以改善 ANALYZE 命令的性能。that can be controlled with parameter.
PostgreSQL 14 增强了信息的监控能力,包括使用 pg_stat_progress_copy 视图跟踪 COPY 命令的进度。该版本提供了监控 WAL 信息的 pg_stat_wal 视图,以及查看复制插槽统计信息的 pg_stat_replication_slots 视图。
PostgreSQL 14 增加了连接管理相关的几个参数,包括 idle_session_timeout(设置关闭空闲连接的等待时间)以及 client_connection_check_interval (允许 PostgreSQL 在客户端断开后取消长时间运行的查询)。
REINDEX 命令现在支持分区表的子索引,同时 PostgreSQL 14 增加了一个新的使用工具 pg_amcheck ,用于检查数据损坏。
复制和恢复
PostgreSQL 14 增强了逻辑复制的各种性能,包括将正在进行中的事务传输到订阅服务器的能力,而不需要等待事务完成。The ALTER SUBSCRIPTION 使得增加/删除订阅更加简单。
PostgreSQL 14 改善了 PostgreSQL 从故障恢复状态中启动的速度,同时还支持针对 standby 模式下的 PostgreSQL 实例使用 pg_rewind 命令同步数据。
安全增强
PostgreSQL 14 提供了两个预定义的角色:pg_read_all_data 和 pg_write_all_data,它们分别可以用于为用户指定全局“只读” 和“只写”权限。
该版本对于新的 PostgreSQL 实例默认使用 SCRAM-SHA-256 算法管理密码。另外,pg_hba.conf 配置文件中的 clientcert 参数现在必须指定为 verify-ca 或者 verify-full,而不能是以前的数值。
从 PostgreSQL 14 开始,pg_hba.conf 配置文件中的 clientname 可以设置为 DN,表示使用证书的专有名称进行基于证书的身份认证。
更多特性
除了以上内容,PostgreSQL 14 还增加了大量的新功能和改进,完整的新特性列表可以参考官方的发行说明。
我们会在后续文章中针对这些新特性具体进行介绍和分析,欢迎关注❤️、评论📝、点赞👍!
-
C#之特性
2022-01-24 22:49:00特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。 二、特性的使用 由方括号,中间包裹着特性名和参数列表(也可以无参)。放置在它所要应用的元素...一、什么是特性?
特性是一种允许我们向程序的程序集添加元数据的语言结构。它是用于保存程序结构信息的特殊类型的类。
或者说
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
二、特性的使用
由方括号,中间包裹着特性名和参数列表(也可以无参)。放置在它所要应用的元素之前(类前,方法前等等)。可以参考下面3个特性。
[Serializable] [XmlRoot("MyClass")] public class MyClass { public int id; [NonSerialized] public string name; }
三、特性的属性
- 在一个元素(如类和属性,方法等等)上可以使用一个或多个特性进行修饰。
- 特性可以拥有参数。
- 程序可使用反射来检查自己的元数据或其他程序中的元数据。
四、预定义的特性
1.AttributeUsage特性
声明特性能够应用于什么类型的程序结构,仅可用在特性声明上,也就是说只能在Attribute的派生类上生效。如下是Serializable特性源码,其在特性声明时使用了AttributeUsage特性。
namespace System { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)] public sealed class SerializableAttribute : Attribute { public SerializableAttribute(); } }
关于AttributeTargets对应的字段可以参考官方文档
AttributeUsage的公有属性:
名字 意义 ValidOn 保存能应用特性的目标类型的列表。构造函数的第一个参数是 AttributeTargets类型的枚举值 Inherited 指示特性是否可被装饰类型的派生类所继承 AllowMultiple 指示目是否可以给目标上多次指定指定的特性。 使用举例,如下是一个自定义特性:
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Field,Inherited =true,AllowMultiple =true)] public sealed class MyCustomAttribute : Attribute { public MyCustomAttribute() { } public MyCustomAttribute(string name) { } } [MyCustom("有参构造")] [MyCustom("有参构造2")] public class MyClass { [MyCustom] public int id; }
2.Obsolete特性
当某些旧方法过时了,你不想要在使用这个方法了,可以用Obsolete特性来将程序结构标注为“过时”,并且在代码编译时会显示警告信息。下面是Obsolete特性的源码。
namespace System { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] public sealed class ObsoleteAttribute : Attribute { public ObsoleteAttribute(); public ObsoleteAttribute(string message); public ObsoleteAttribute(string message, bool error); public bool IsError { get; } public string Message { get; } } }
从源码中,我们可以指定这个特性能够用在类,结构,枚举,构造,方法,属性,字段,事件,接口上。通过它的构造方法,我们可以知道它有三个重载。这个特性可以不传入参数,可以传入一个参数,也可以传入两个参数。
下面是对这个特性的举例使用。
例如使用一个参数的重载时,在MyClass类上标注[Obsolete("类已经过时")]
,代码编译时会显示警告“类已过时”。在NewMyClass的Sum方法上标注[Obsolete("方法已经过时,请使用NewSum()")]
,在调用Sum方法时,也会有相应的警告显示。[Obsolete("类已经过时")] public class MyClass { public void Sum() { } } public class NewMyClass { [Obsolete("方法已经过时,请使用NewSum()")] public void Sum() { } public void NewSum() { } } public class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); NewMyClass newMyClass = new NewMyClass(); newMyClass.Sum(); newMyClass.NewSum(); } }
虽然上面的代码,代码编译时显示了警告,但是代码仍然可以执行。而在使用两个参数的重载时,并将Obsolete的第二个参数设置为true时,将会标记为错误,如下所示。
public class NewMyClass { [Obsolete("num", true)] public int num; } public class Program { static void Main(string[] args) { NewMyClass newMyClass = new NewMyClass(); newMyClass.num = 1; } }
3.Conditional特性
Conditional特性允许我们包括或排斥特定方法的所有调用。简单的讲它可以根据条件编译来进行方法调用。
#define MyClass using System; using System.Diagnostics; namespace AttributesConditional { public class MyClass { [Conditional("MyClass")] public void MethodA(string msg) { Console.WriteLine(msg); } public void MethodB() { Console.WriteLine("进行中"); } } class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); myClass.MethodA("开始"); myClass.MethodB(); myClass.MethodA("结束"); Console.ReadKey(); } } }
如上方代码所示,我们在代码的第一行定义一个编译符号(
MyClass
),即是#define MyClass
,而在方法上使用这个特性[Conditional("MyClass")]
并指定编译符号(MyClass
)。运行程序,其结果如下所示。运行结果:
开始 进行中 结束
而当我们将第一行
#define MyClass
注释掉后,再次运行,结果如下:进行中
通过观察,我们发现,当在代码第一行定义编译符号(如:
#define MyClass
后,使用特性指定编译符号(如:[Conditional("MyClass")]
),运行时会调用相应的方法(如:MethodA),而如果没有在第一行定义编译符号,那么相应的方法会被忽略,不会被调用。Conditional特性可以应用在方法和类上。当然这需要符合一定的规则。
- 方法必须是类或结构体的方法
- 方法必须为void类型。
- 方法不能被声明为override,当可以标记为virtual。
- 方法不能是接口方法的实现。
- 类上使用必须是Attribute类的派生类。
- 该特性允许使用多个。
需要注意的是定义编译符号必须是在程序入口代码的文件的第一行。
五、多个特性使用
- 多层结构:
[特性1(参数...)] [特性2(参数...)]
- 逗号分隔
[特性1(参数...),特性2(参数...)]
如代码下面所示:
[Serializable,Obsolete] public class MyClass { private int num; }
[Serializable] [Obsolete] public class MyClass { private int num; }
六、自定义特性
除了预定义的一些特性,我们也可以根据需求来自定义一些特性。
1.如何声明自定义特性。
- 定义一个类并且这个类派生自
System.Attribute
。 - 类的名字以Attribute后缀结构。
- 为了安全性,可以用一个sealed修饰成一个密封类型(非必须的),以防止被其他类所继承(可以参考预定义特性的源码,其都被sealed所修饰)。
例如下面代码:
那么如何使用呢?
可以这样写[MyCustomAttribute]
,也可以简写为[MyCustom]
。当然这里推荐是简写就行了。特性可以有公有成员,但是公有成员只能是:
- 字段
- 属性
- 构造函数
(1)构造函数
如果在声明自定义特性的时候不声明构造函数,那么编译器会为你产生一个默认的无参构造。
自定义特性的构造函数可以被重载。声明自定义特性构造和声明其他类一样,使用类名。例如下面所示。public sealed class MyCustomAttribute : Attribute { public MyCustomAttribute() { } public MyCustomAttribute(string name) { } }
当我们使用特性时,其实就是在指定使用哪个构造函数来创建特性的实例。使用如下。
[MyCustom("有参构造")] public class MyClass { [MyCustom] public int id; }
(2)限制特性的使用
有些预定义的特性限制了其使用范围,例如有的特性只能在类上使用,有的特性只能在字段上使用,这种限制是通过AttributeUsage来实现的,这在上面已经介绍过了。
2.如何访问自定义特性
就像在类中定义了属性,但是属性没有被调用,那么这个属性所蕴含的信息我们并不会知道。同理,仅仅声明了自定义特性,并且应用在某些程序结构上使程序结构和所应用的特性相关联,但是着仅仅相当于一个标识,我们并不没有检索这些特性蕴含的信息。所以,我们就需要通过某种反射的方式来访问自定义特性。
(1)IsDefined方法
IsDefined(Type, Boolean) :检测某个特性是否应用到某个类上。
- 第一个参数是需要检查的特性的Type对象
- 第二个参数是指示是否搜索此成员的继承链来查找这个特性。
下方示例是一个检测
MyClass
类上是否应用了一个MyCustom
的特性,这就用到了IsDefined
方法,其第一个参数就是要接受检查的MyCustomAttribute
的Type对象,第二个参数就是指示是否搜索MyClass
的继承链来查找这个特性。[AttributeUsage(AttributeTargets.Class)] public sealed class MyCustomAttribute : Attribute { public MyCustomAttribute() { } } [MyCustom] public class MyClass { } class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); Type type = myClass.GetType(); bool isDefined = type.IsDefined(typeof(MyCustomAttribute), false); if (isDefined) Console.WriteLine(type.Name+"上使用了特性MyCustom"); Console.ReadKey(); } }
运行结构:
MyClass上使用了特性MyCustom
(2)GetCustomAttributes方法
GetCustomAttributes(Boolean):返回应用到结构上的特性的数组。参数指定是否搜索继承链查找特性。
GetCustomAttributes(Type, Boolean):返回应用到结构上的特性的数组。第一个参数,要搜索的特性类型。第二个参数,指定是否搜索继承链查找特性。[AttributeUsage(AttributeTargets.Class)] public sealed class MyCustomAttribute : Attribute { public string Name { get; set; } public int Num { get; set; } public MyCustomAttribute(string name,int num) { Name = name; Num = num; } } [MyCustom("MyCustomDemo",1)] public class MyClass { } class Program { static void Main(string[] args) { Type type = typeof(MyClass); object[] attArr = type.GetCustomAttributes(false); foreach (var att in attArr) { MyCustomAttribute myCustomAttribute = att as MyCustomAttribute; if (myCustomAttribute != null) { Console.WriteLine("name:"+myCustomAttribute.Name); Console.WriteLine("num:"+myCustomAttribute.Num); } } Console.ReadKey(); } }
运行结果:
name:MyCustomDemo num:1
上面示例仅仅是针对类上的,那么针对字段的如何实现?
[AttributeUsage(AttributeTargets.Class| AttributeTargets.Field)] public sealed class MyCustomAttribute : Attribute { public string Name { get; set; } public int Num { get; set; } public MyCustomAttribute(string name,int num) { Name = name; Num = num; } } [MyCustom("MyCustomDemo",1)] public class MyClass { [MyCustom("id", 2)] public string id; } class Program { static void Main(string[] args) { Type type = typeof(MyClass); FieldInfo[] fieldInfos = type.GetFields(); foreach (var fieldInfo in fieldInfos) { object[] attArr = fieldInfo.GetCustomAttributes(false); foreach (var att in attArr) { MyCustomAttribute myCustomAttribute = att as MyCustomAttribute; if (myCustomAttribute != null) { Console.WriteLine("name:" + myCustomAttribute.Name); Console.WriteLine("num:" + myCustomAttribute.Num); } } } Console.ReadKey(); } }
通过上面代码,我们可以发现,字段的也是用GetCustomAttributes方法,不过不是通过type直接调了,而是通过先通过反射获取到字段,然后通过获取的字段引用调用GetCustomAttributes,接下来就和签名的一样了。
那么同理,方法上也可以用类似的方法获取到数据。
[AttributeUsage(AttributeTargets.Class| AttributeTargets.Field|AttributeTargets.Method)] public sealed class MyCustomAttribute : Attribute { public string Name { get; set; } public int Num { get; set; } public MyCustomAttribute(string name,int num) { Name = name; Num = num; } } [MyCustom("MyCustomDemo",1)] public class MyClass { [MyCustom("id", 2)] public string id; [MyCustom("method",3)] public void Method() { } } class Program { static void Main(string[] args) { Type type = typeof(MyClass); MethodInfo[] methodInfos = type.GetMethods(); foreach (var methodInfo in methodInfos) { object[] attArr = methodInfo.GetCustomAttributes(false); foreach (var att in attArr) { MyCustomAttribute myCustomAttribute = att as MyCustomAttribute; if (myCustomAttribute != null) { Console.WriteLine("name:" + myCustomAttribute.Name); Console.WriteLine("num:" + myCustomAttribute.Num); } } } Console.ReadKey(); } }
总结:我们可以通过反射的GetCustomAttributes方法来获取应用到结构上的特性的数组,来获取数据。无论是类,字段或是方法等等结构,我们都可以通过反射得到相应的结构引用,在通过结构的引用调用GetCustomAttributes方法来得到结构上的特性的数组,以此来得到相应的数据。
七、最后
我的学习总结就到这里,更多特性相关的可以参考官方文档
-
区块链具有的8种特性
2022-02-26 18:52:09本文将介绍区块链的8种特性 分布式数据库 区块链是一种分布式数据库,大部分区块链技术在底层是线上采用了传统的数据库保存数据。例如:维护比特币代码的Bitcoin Core团队实现的比特币就采用LevelDB 来索引...本文将介绍区块链的8种特性
分布式数据库
区块链是一种分布式数据库,大部分区块链技术在底层是线上采用了传统的数据库保存数据。例如:维护比特币代码的Bitcoin Core团队实现的比特币就采用LevelDB 来索引和保存区块链的链状态信息,而在比特币的钱包则采用Bekerly DB。不同的区块链可能采用不同的数据库系统实现,同一种区块链的不同节点也可能采用不同数据库。
数据库可视为电子化的文件柜——存储电子文件的处所,用户可对文件中的数据运行新增、截取、更新、删除等操作。
分布式数据库是用计算机网络将物理上分散的多个数据库单元连接起来组成的一个逻辑上统一的数据库。每个被连接起来的数据库单元被称为站点或节点。分布式数据库有一个统一的数据库管理系统来进行管理,被称为分布式数据库管理系统。
区块链网络各个节点是复制同步的分布式数据库。每个节点上的数据库都有着完整的区块链上的所有数据和历史信息。由于每个节点上都有完整的检索数据,因此每个节点都直接查询到区块链上的任何记录,不需要依赖第三方。
图1-1 中心化账本和分布式账本的比较示意
共识机制:让各个节点的数据库保持一致的方法
谈到区块链,我们经常会听到“共识”(Consensus)这个概念,各种共识算法的名称,例如工作量证明(Proof of Work, 缩写POW)、 权益证明(Proof of Stake, 缩写POS)。
工作量证明(POW)是一种经济对策。一般要求用户进行一些耗时适当的复杂运算,且答案能被服务方快速验算,以耗用的时间、设备、能源作为担保成本,来确保服务与资源被真正使用。
工作量证明现已成为以比特币为代表的加密货币或区块链的主流共识机制。
权益证明(POS)(又称持有量证明)权益证明(又称持有量证明)是2012年出现的共识机制。与工作量证明不同,权益证明要求一组验证者轮流对下一个区块进行提议和投票,每个验证者的投票权重取决于其持有权益证明的多少。权益证明的显著优势在于具备安全性、降低集中化的风险以及提升能效。
区块链就是一种分布式数据库,是有很多节点的数据库,并且每个节点可以独立验证数据,不需要依赖第三方。那么,一个问题就诞生了:如何让这些节点的数据库保持一致?传统的分布式数据库有一个重要的假设,即分布式数据库的每个节点都是“友好的”。因此,要保持数据一致,主要克服一些技术性问题,比如网络延迟怎么办?网络临时中断怎么办?不同节点上的用户想篡改数据怎么办?……但这些问题都不可能忽略。除此之外,区块链一个重要的想法,不能默认各个节点都是“友好“的。有可能有些节点有意”制造麻烦”。
“共识”的概念很容易理解。共识的本质,就是让区块链各个节点上的数据保持一致的方法。而各种不同的共识算法,就是为了此目的采用的不同技术方法。“共识机制”的根本母的在于确保区块链各节点的数据是一致的。
达成共识是一个“慢”且“费劲”的过程,这就是代价——为了实现区块链系统的分布式、去中心化、独立验证、数据难以被篡改等特征。由于达成共识是一个“慢”且“费劲”的过程,故可以肯定的是区块链系统的性能始终低于集中式系统。
共识算法对公链(公共区块链)尤其重要。因为任何人不需要许可就能加入这类区块链网络,因此有可能出现由“恶意”的区块链网络,这就导致了共识算法几乎是保证这类区块链系统可靠的唯一途径。而需要许可的区块链,例如联盟链,其成员被一定规则约束,从身份识别验证、加入网络、访问权限到参与活动都受控制。在这类受约束的区块链中,不只有共识机制这一方法保证系统的安全和数据的一致性。例如实用拜占庭容错算法(Practical Byzantine Fault Tolerance 缩写为PBFT),而在联盟链选择工作量证明机制(POW)是不必要的。
P2P通信
成为一个有“共识”的、可靠的分布式数据库,且不依赖任何中间机构,解决这个问题的方法就是P2P(点对点)通信。所谓点对点,即Point to Point,节点之间的通信不需要经由第三方。P2P通信是最简单、直接、“原始”的通信方式,是任何网络通信的基础。这种通信方式可以减少网络依赖关键的中间节点,可以防止部分节点恶意操控整个区块链产生影响。由于采用了P2P通信方式,区块链“去中心化”特性更强。
P2P在隐私性要求高的网络中和文件共享领域得到了广泛的应用,由于其点对点的特性,可避免经过“中间人”。
图1-2 客户端服务器架构与点对点架构的比较示意
公开可验证的数据
区块链的节点是可见的。对于比特币和以太坊这种典型的公链来讲,链上的任何数据都是完全公开的,全世界任何人都可以看到,而且区块链上的数据是难以删除或修改的,因此数据一旦在区块链上发布就成为公开的信息。
区块链上的数据普遍使用常用的加密和签名算法来保证数据的正确性和一致性。在每个区块链节点上都可以立即验证链上数据的正确性。
区块链是如何进行数据的验证呢? 这涉及到两个重要的计算机密码学相关技术:一是哈希算法,二是数字签名技术。
①哈希算法又称散列算法、哈希函数、哈希算法的特点是任何原始数据的小改动都会改变输出数字的大变化,比那个且无法反向推导出原始数据的变化。
②数字签名是一类用于快速验证的算法。 每个使用者有一对密钥:一把公钥一把私钥。用户会使用私钥生成签名,用公钥验证签名。
难以篡改的数据记录
难以篡改的数据记录经常有人理解为“不可篡改”数据记录。严格来讲,这并不正确,区块链上的记录并不是不可篡改,而是“难以篡改”。在前面提到,区块链是一种分布式数据库,每个节点都有独立验证的能力,通过共识保证各个节点数据一致。也就是说,要想“篡改数据”就得骗过每个节点的验证算法,其次还得骗过整个区块链的共识机制,让所有节点改变,这变得更困难。
区块链是个“不支持删除操作”的数据库,区块链的数据只能不断增加,不会被删除。由于这个特点,使得区块链比较适用于非常重要、需要留下记录的场合。
区块链的数据虽然难以被篡改,但并不意味着“不可篡改”或“数据永不丢失”。一般情况下,区块链的节点越多、越分散,数据被篡改或完全被破坏的难度就越大。在一个去中性化程度非常高的区块链上,要篡改或破坏数据是十分困难的。
智能合约:链上的“代码逻辑”
以太坊是第一个引入更复杂的代码逻辑的区块链,并沿用了Nick Szabo在1995发明的词汇“智能合约(Smart contract)”。从名字上看,可能“误导”了一部分大众。以太坊的智能合约不具备人们所说的“智能”(人工智能等),也不是大众理解的“合约”(合同、法律条款),而是一种新的结合了区块链的计算模型,配合了一个图灵完备的虚拟机和一种新的程序设计语言。
- Nick Szabo在其论文《智能合约:数字化市场的构建模块》中首次提出“智能合约”的概念。智能合约是一套以数字形式定义的承诺,合约参与方可以在上面执行这些承诺的协议,其基本理念是把合约条款嵌入硬件和软件中。以太坊实现了智能合约这一概念。
图灵机的提出是为了研究可计算问题而构思的抽象计算模型——将传统的纸币计算过程进行抽象,由虚拟机器人进行的数学运算,是现代计算机的雏形。
虚拟机是一种特殊的架构软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于虚拟机这个软件所创建的环境来操作其他软件。以太坊的虚拟机(Ethereum Virtual Machine,缩写EVM)。
自主账户体系
区块链上的“账户”是没有“人”给你“分配”的。这与传统的互联网服务,或者是更传统的银行、证卷公司等,用户需要在对方提供服务时,首先要做的就是在其平台上申请和开通账户。为什么在区块链中有价值的数字货币,却不用开设账户呢?所谓的账户,是某个机构在本记账系统中给用户分配一个标示,这个标示属于用户且受机构规范的分账记录。也就是说用户得先从银行或证卷公司等平台“注册”一个账户,才能在这些平台中享受服务。而在自主账户体系中用户不需要向任何平台“注册”账户。
所谓自主账户,指账户的产生不是由其他人分配、产生,而是用户自我产生、自我申明。用户只需按照一个算法执行一下,就可以获得自己独特且安全的账户。自主账户体系相当于——去中心化身份,人作为个体,身份是自主的,不需要向任何人证明自己的身份。
区块链并不是真正匿名的
区块链普遍采用的自主账户地址往往是一长串字符或数字。除少数隐私区块链技术外,大部分区块链上的数据是完全公开的,人们可以清晰知道每笔交易的相关账户,如果是一笔转账,转账的金额和交易账户都清清楚楚,这个账户的一举一动都可以被全世界看到,且一公开就不能被抹去。
区块链之所以能够保护用户隐私,原因在于区块链账户无法对应用户的真实身份。正如前段提到的自主账户体系。自主账户不需要向任何人或机构申请,因此用户在使用自主账户时,没有任何信息能把账户与真实世界的个人信息关联起来。从这个角度看,区块链的匿名性相比于互联网应用会更好。这种“匿名性”和“隐私性”一度为地下交易、暗网提供便利。
-
Android11新特性
2020-05-07 17:59:11前不久,谷歌发布了Android 11 的预览版,从开发者预览版我们可以了解到,Android 11增强了对用户隐私的保护,提供了很多吸引用户的新特性,并且可以更好地支持可折叠设备和 Vulkan 扩展程序等等。 谷歌官方的资料... -
Oracle 19c十大新特性
2020-01-16 07:30:00eygle对Oracle 18c、19c和20c十大新特性做了介绍,https://www.eygle.com/archives/2019/10/oracle_database_20c_... -
6个质量特性和21个质量子特性
2019-11-22 13:07:39六个特性:功能性、可靠性、易用性、效率、维护性、可移植性1、功能性:当软件在指定条件下使用时,软件产品提供满足明确和隐含要求的功能的能力 1.1、适合性:软件产品为指定的任务和用户目标提供一组合适的功能的... -
软考知识点笔记之----信息系统特点
2020-01-02 11:39:47系统可以包括若干子系统,系统之间也能够耦合成一个更大的系统。换句话说,组成系统的部件也可以是系统。这个特点便于对系统进行分层、分部管理、研究或者建设。 (3)稳定性。系统的稳定性是指:受规则的约束,系统... -
华为存储特性
2020-11-25 00:14:34华为存储特性 1、SmartPartition SmartPartition是一种性能特性,根据不同业务特点分配存储系统的缓存资源来满足不同应用系统的服务质量要求。 由于单个存储系统要面对的应用数量急剧增加,且各业务应用之间的I/O... -
JDK 11主要特性一览
2018-09-21 21:18:49确定的新特性包括以下17个 181 嵌套类可见性控制 309 动态文件常量 315 改进 Aarch64 Intrinsics 318 Epsilon–一个无操作的垃圾收集器 320 删除 Java EE 和 CORBA 模块 321 HttpClient 323 用于 Lambda ... -
vue 3.0新特性
2018-10-22 22:21:17另外,代码库现在改为用 TypeScript 编写,虽然这会使得“熟练TypeScript”成为对新代码库进行贡献的一个前置要求,不过我们相信有类型信息配合 IDE 的支持,对于一个新的贡献者来说,要做出有意义的贡献,实际上... -
软件质量模型的6大特性和27个子特性
2018-12-13 22:08:20软件测试、软件测评,围绕软件质量这一...ISO9126软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成,建议大家深入理解各特性、子特性的含义和区别,在测试工作需要从这6个特性和27个子特性去测试... -
Android 10系统新特性解读
2019-03-04 12:12:01泄漏的信息中包括一个“传感器关闭”切换按钮,该按钮将设备置于飞机模式,并禁用手机上的所有传感器。 5、 屏幕录制 Android Q 支持屏幕录制,就像 iOS 一样。透过泄漏信息我们发现,Android Q的录屏功能还不... -
敏感信息定义与实例
2019-06-16 16:05:46近年,随着信息技术的快速发展和互联网应用的普及,越来越多的组织大量收集、使用个人信息,给人们生活带来便利的同时,也出现了对个人信息的非法收集、滥用、泄露等问题,个人信息安全面临严重威胁。 0x01 个人... -
【计算机组成原理】第三章 系统总线(2)总线特性及性能指标
2019-10-26 21:46:48总线特性包括以下几项: · 机械特性 机械特性是指总线在机械连接方式上的一些性能,如插头与插座适用的标准,尺寸、形状、引脚个数以及排列顺序 · 电气特性 电气特性是指总线的每一根传输线上信号的传递方向和有效... -
MongoDB的几个特性
2017-06-20 19:48:09Config Server:存储整个集群信息,其中包括chunk数据块信息。 Router:路由服务,让整个集群看起来像单一数据库,前端应用可以透明使用。 在配置集群的时候,需要启动路由服务,mongod实例。除此之外,使用时... -
软件质量的定义及其六大特性(质量模型)
2020-10-18 13:58:25软件质量是软件特性的综合,指软件满足规定或潜在用户需求的能力,其主要从内部质量、外部质量、使用质量和过程质量这四个方面来衡量。 2、软件质量模型 测度与度量:在软件质量中用于测量的一种量化的标度和方法即... -
什么是软件,软件有哪些特性?
2020-04-26 21:00:49包括过程、方法和工具三要素 过程 支持软件生命周期的所有活动 方法 为软件开发过程提供“如何做”的技术 工具 为软件开发方法提供自动的或半自动的软件支撑环境 ISO9126软件质量的六个一级特性 功能性、可靠性、... -
H5的主要特性和三个部分
2018-12-29 16:40:05H5,其实就是HTML的第五个版本,1997年曾发布过HTML4,H5是升级版,那HTML是...H5,本质上不是什么新的技术,但是由于它在功能特性上有了极大地丰富,再加上各大浏览器性能上的支持,H5相对H4会有着更加广泛的应用。 ... -
软件质量模型的6大特性27个子特性
2017-05-27 15:13:21软件质量模型的六大特性27个子特性 一、功能性: 1、适合性:软件是否提供了相应的功能 2、准确性:软件提供的功能是否正确(用户需要的) 3、互操作性:产品与产品之间交互数据的能力,例如word对... -
Android平台特性
2016-11-17 16:47:484)一个通知管理器(Notification Manager)使得应用程序可以在状态栏中显示客户通知信息。 5)一个活动类管理器(Activity Manager)用来管理应用程序生命周期并提供常用的导航回退功能。 3. ... -
对象的三大特性
2019-03-11 20:57:01面向对象的三大特性 封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法让可信的类或对象操作,对不可信的进行信息隐藏。 通过权限设置来限制外部访问,权限修饰符如下几个:private、(default)、... -
Oracle 19c 新特性一览
2019-02-14 14:33:42Oracle 19c 新特性一览 标签(空格分隔): Oracle 19c 文章目录Oracle 19c 新特性一览可用性一般简化了 DG Broker中对于数据库参数的管理动态修改Fast-Start Failover (FSFO)目标库Broker的FSFO支持仅观察模式当... -
H5新增了哪些新特性
2021-09-08 14:22:54H5新增了哪些新特性? 前言 本期为大家总结面试时常被问到的一个问题,那就是H5新特新有哪些,目前H5的新特性在实际工作中也经常会用到。本章主要总结为主,因此没有深入记录,若想深入了解,还需单独研究哦~ 1.语义... -
基于DSP的真空断路器机械特性测试系统硬件设计
2020-09-27 16:03:34研究、开发了真空断路器机械特性测试系统,克服了以往的一些应用难题,能实现包括机械、电气、触头温度等多种断路器运行特性的综合监测;该系统采用上下位机结构,下位机是一个基于TI公司的VC33数字信号处理器的数据... -
kafka-各版本特性
2019-03-17 20:08:46Apache Kafka 0.10.0.0现在支持更多的SASL特性,包括外部授权服务器,在一台服务器上支持多种类型的SASL认证以及其他的改进 Kafka Connect得到了持续提升。 在此之前,用户需要监控日志以便看到各个connectors... -
软件测试质量的六大特性和27个子特性
2020-07-14 09:50:25《软件工程—产品质量》(GB/T 16260-2006)中规定对软件的每个质量特性与子特性都有定义: 一、功能性:是指当软件在指定条件下使用,软件产品满足明确和隐含要求功能的能力。 适合性:是指软件产品与指定的任务和... -
Android 各个版本以及新特性
2018-08-23 09:23:23Android 4.2沿用“果冻豆”这一名称,以反映这种最新操作系统与Android 4.1的相似性,但Android 4.2推出了一些重大的新特性,具体如下: Photo Sphere全景拍照功能;键盘手势输入功能;改进锁屏功能,包括锁屏... -
Android studio 4.2新特性及升级异常
2021-05-06 11:42:30Updated New Project wizards 更新了“新项目”向导,以使其更易于浏览,选择模板以及输入有关新项目或模块的信息。 9. v3 and v4 signing now supported Android Gradle插件4.2现在支持v3和v4 APK签名格式。 APK ... -
无线信道传输特性
2020-08-07 15:47:50无线信道的传播特性是瞬息万变的,通常认为无线信道衰落可以分为大尺度衰落和小尺度衰落,又称为快衰落和慢衰落。小尺度衰落传统上从两个角度来描述其信道特性:即时域上对应的多径效应;频率域上对应的多普勒频移效应...