基于区块链的电动汽车充电网络信任管理机制
2022-12-26唐郑熠陈龙辉胡文瑜
黄 达,刘 传,唐郑熠*,3,陈龙辉,胡文瑜
(1.福建工程学院 计算机科学与数学学院,福建 福州 350118;2.湖南工商大学 移动商务智能湖南省重点实验室,湖南 长沙 410205;3.福建工程学院 福建省大数据挖掘与应用技术重点实验室,福建 福州 350118)
随着化石燃料的逐渐枯竭,电动汽车在节能减排和环境保护方面的优势日益凸显[1]。随着电动汽车愈来愈多,电动汽车充电站[2]的需求量也将变得巨大。由于充电站的数量变多,各个充电站的使用损耗程度、服务质量、充电效率或者顾客满意度又不同,需对各个充电站的信用进行分析。
自比特币诞生以来,区块链技术得到了广泛的关注,并被应用于智能金融、物联网等多个领域[3]。区块链[4]是比特币的底层技术,具有去中心化、匿名性、可追溯以及数据不可篡改等特性,与信任机制中的长期发展目标可信、可靠等不谋而和[5]。
许多学者对信任机制进行了相关研究。LI等[6]提出了一种基于信任的消息广播方案,车辆的信息是由车辆自身进行操作,包括汇总和信用值的计算等。刘海等[7]提出了一种基于信誉的理性秘密共享方案,将博弈论和传统的秘钥相结合,分析理性参与者的行为偏好等,并设计了信誉惩罚机制。罗敏等[8]设计了一个无人系统的信任模型,针对各个节点之间难以全面地建立直接的信任关系,节点之间的信用值随着时间的变化而具有主观性和不确定性,综合运用了各个节点的信用值并且运用信任传递方式生成信任链条。这项工作使得各个节点之间相互制约和警示,大大降低了节点作弊的风险,具有相对强的可靠和安全性,不容易受到恶意节点的影响。为了解决区块链技术中基于算力的共识算法所出现的问题,ZHOU等[9]设计了一种基于历史行为的信用值代替算力,但是此种方法仅仅只能根据特定的行为去决定各个节点的信用值,在一定程度上提高了区块的生成效率,减小了无用算力带来的能耗。OLUOCH等[10]提出一种基于路边的单元的信任机制,车辆在遇到情况的时候将信息发给路旁所设置的类似基站或者服务器等单元控制器。YAO等[11]提出了集合多个因素的信用评估的方法,综合对事件相关度、主体可信度、距离和时间的相关度进行考虑,并对最后的可信度加权分析。这项工作考虑到了事件的特征与时间和空间的相关性,对于辨别虚假的消息有很好的作用。
上述研究成果将信任机制分为两种。一种通过信任传递方式构成链,虽然可以解决中心化遇到的一些问题,比如服务效率低、计算负荷大等,但是在数据存储、安全性方面依旧存在问题。另一种使用信用值代替算力的方法,不但使系统的响应速度加快,还具有数据容错性强等优点;但是单凭通过信用值高低选举区块链中的记账节点还是存在垄断的风险。
共识机制作为区块链技术的核心部分,使得区块链系统可以稳定安全地运行。其中:
工作量证明(proof of work, PoW),这种方法最大的缺陷就是对能源的损耗和浪费,所以不符合社会的发展。为了解决这个问题,因特尔提出了基于消逝时间的证明机制[12]。在这样的机制下,节点参与竞争的代价相对挖矿来说将降低很多,所有的节点拥有的机会也较为平等。
权益证明机制(proof of stake, PoS)由Sunny King在点点币白皮书中提出。为了解决比特币的PoW带来的大量能源浪费等问题,他引入了币龄的概念,每个代币都有相应的价值来衡量用户参与决策的权利[13]。PoS虽然可以解决能源浪费的问题,但是从系统安全方面来说,正是因为不需要挖矿,所以极容易造成类似女巫攻击的恶意行为[14]。
基于对电动汽车充电站的信任评估以及传统中心架构的风险,本文提出一种融入了区块链技术的电动汽车充电站信任机制,同时将轮盘赌算法融入到通过信用值选举记账节点的共识机制之中。这样,不仅避免了由于信用值过高而出现的记账节点垄断行为,而且增加了作弊行为的难度。
1 基于区块链的充电站网络存储设计
充电站网络主要是由多个充电站组成的一个联盟,每个充电站都有自己本身的服务器和一个客户终端,并且客户终端由区域下层链选举出的总负责节点负责。正常情况下,负责节点不被允许进入客户终端,客户终端只在查询问题时打开。为了加快系统运行速度,减小系统的吞吐量,本文设计两条链,分别为下层链和上层链。下层链主要是按照区域划分,在一定的区域内所有的充电站服务端构成一条下层链,而所有的下层链则在逻辑上构成一条上层链。其中,充电站用户对充电站的评价内容保存在充电站的本地服务器上,评价内容进行哈希运算得出的哈希值则存储在充电站的下层链上,由下层链块标识、评价用户伪身份、各充电站标识构成的安全索引则存储在上层链上。
1.1 区块链存储结构
区块链是一种信息技术的术语,从本质上来说,它是一种链式的数据结构,或者是一种多中心化的数据库。由一连串的密码学方法生成的数据块被称为区块,每个区块中都包含了某一时间段内的全网的交易信息。区块里的交易信息是被某一时间段内具有打包区块权力的矿工打包。区块与区块之间是由哈希索引相连接的,被称为区块链。每个区块中的交易信息,实际是交易信息进行一系列的哈希运算得出的值,通过Merkle树保存信息,以确保交易的安全性。本文设计的区块分为区块头和块身,区块链结构如图1所示。
图1 区块链结构Fig.1 Blockchain structure
1.2 存储管理
定义一条区块链Ψ=(V,fn),其中:
V= {c}是区块集合,一个区块c包含着块头和块体两个部分,分别记为header(c)、body(c)。
映射fn=V→V指的是与前一个区块的链接关系,而fn(c′)=c表示c是c′的上一个区块。
1.2.1下层区块链
1)块头结构
下层区块的块头结构如表1所示。
表1 下层区块的块头结构Tab.1 Block head structure of lower block
块头重要元素的说明如下:
Pre_hash表示的是与前一个区块之间的链接关系,对于区块链Ψ=(V,fn),满足:
∀c,c′∈V:fn(c′)=c⟹c′.Prev_hash = hash(header(c))
其中:hash(x)是哈希运算。
Merkle_root表示的是块体中的Merkle树的根Hash,它最主要的作用是防篡改。
Pub_key和Dig_sig是区块生成者的公钥与数字签名。数字签名是区块生成者的私钥对信息加密后的结果,为了确认此区块为此节点生成;公钥是为了验证签名的正确性且只能通过区块生成者的公钥解开。
Block_id的作用类似比特币中的区块高度。文中下层链和上层链这两条链,用区块标识表示,便于节点遍历和查找。
2)块体结构
下层区块的块体是一棵Merkle树,Merkle树的各个叶子节点代表着此区块包含各个交易的Hash值,本文将它称为交易树。
在这里,对树的各个部分进行定义。树中所有的节点集合定义为J,节点之间的链接的集合定义为H= {(j,j′) |j,j′∈J},此树定义为Tx_Tree(J,H)。当Tx_Tree(J,H)存在时,当且仅当满足以下条件:
(1)存在唯一的l∈J,都∃(j,l)∈J。
(2)对∀k∈J∧k≠l,仅存在唯一的(k,k′)∈H∧k′∈J。
定义交易树:一棵交易树Γ=(Jh∪Pm,H),其中:
(1)Jh∪Pm是所有节点的并集,其中,Jh是所有Hash值节点的集合,而Pm是所有交易节点的集合,Merkle树的所有叶子节点都是交易信息节点。显然Jh∪Pm=J。
(2)H={(k,m)|k∈Jh,m∈Jh∪Pm}是树中各个节点之间的链接,当且满足以下条件:
对∀k∈Jh,当且仅当m,n∈Jh∪Pm,存在唯一的(k,m), (k,n)∈H∧k=hash(m‖n)。
(3)Tx_Tree(J,H) = True
其中hash(m‖n)表示的是节点m,n链接所得出结果的Hash值;对叶节点而言是对2个叶节点的交易信息连接得出的结果进行Hash运算,并将其转换为二进制串。下层区块的数据结构及其存储内容,如图2所示。
图2 下层区块数据结构Fig.2 Lower block data structure
1.2.2上层区块链
1)块头结构
上层区块的块头结构如表2所示。
表2 上层区块的块头结构Tab.2 Block head structure of upper block
块头重要元素的说明如下:
Height指的是该区块所在链的位置,方便对信息查找和遍历,也用来对数据进行追溯。
2)块体结构
上层区块的块体同下层区块块体相同,为一棵Merkle树,仅仅为存储内容不同。
上层区块链的Merkle树,由于存储的主要信息为信用值,所以本文将其称为信用默克尔树。
上层区块链的结构与下层区块链的结构类似,但是存储内容有所不同,也是整体区块链系统重要的一部分。
对于上层区块链,主要存储充电站的信用分,具有串联所有区域服务器的作用,便于上层链中的各个节点计算当前信用分,以及查询。当用户需要知道充电站的信用分,则仅仅需要将信息发给就近服务器,再广播至联盟节点进行检索返回。正常情况下,下层区块链计算出用户的主观总得分(节点信用分)上传,且客观因素影响分(环境信用分)也相应上传;作为上层链节点时,需要计算当前获得的信用总分和信用值,并且上传各个充电站累加的诚实度,便于下一个获得上层链区块记账权的节点进行计算。上层区块的具体存储如图3所示。
图3 上层区块数据结构Fig.3 Upper block data structure
虽然块头信息相似,但是下层区块链主要是起到数据收集与保存的功能,而上层区块链中各个节点则起到信用分的计算及其存储的作用。系统使用双层区块链,不仅能够减小各个节点的工作量,还可以加快系统的响应时间。
2 评分数据收集上传方案
本文利用区块链的技术来存储信用数据,并将不同的数据分别存入到区块链当中。充电站双层链系统结构如图4所示。
图4 充电站双层链系统结构Fig.4 Double-layer chain system structure of charging station
从图4可以看出,在进入系统之前,所有的充电站和用户都需要进行注册,并且生成自身的公私钥对。当充电用户充完电后,将评分信息与相应的消费记录发送给就近的基站,基站收到信息后,对相应的消息进行整合,再将整合的信息上传到下层链网络中,下层链的共识节点收到整合的信息后,再计算出相应的评分数据,广播至下层链网络中验证,验证通过则上链。在固定时间内上层链共识节点提取下层链区块中的数据,计算出信用值后,广播至上层区块链验证,并上链。
充电数据上链的基本流程为用户注册、用户数据上报、区块生成、区块验证和上链。
2.1 系统初始化和实体注册
充电站服务器(charging station server, CSS)使用密钥和数字签名的生成算法生成相应的公私钥对(Genc,Gsig),充电用户(charging user, CU)通过客户端随机生成自己的公私钥对(pubmkey, privmkey),通过输入的MA集合{a1,a2,a3,…,am}获得相应的数字签名privmkey_sig,同时各个服务器也生成相应的公私钥对(pubnkey, privnkey),并且由交易签名生成的签名钥privnkey_sig,对数据集合MB{b1,b2,b3,…,bn}签名。
在数据的上报与存储的过程中,CU、CSS对评分数据的签名和加密分别由(Gsig,Ssig,Vsig)(生成、签名、验证)完成。存储聚合评分数据的区块链节点即CSS,通过本文提出的基于轮盘赌策略的共识机制(election of roulette, EoR)选举出的记账节点上传并存储交易。
2.2 用户数据上报
用户每次上传的都是自己充电过后评判的数据,所以此类数据都是一维的;而服务器打包的数据是在这一时间段内n个用户的所有数据,所以服务器打包的交易数据是n维的。用户上传数据{a1,a2,a3,…,am}的同时,用户客户端使用用户的私钥privmkey_sig对数据进行签名。基站在收到信息后,利用下一层服务器的公钥(pubnkey)对数据进行加密,再将加密后的数据和数字签名一同发给下一层的CSS。
算法1是用户上传评分数据的算法。客户端从充电用户(charging users)获得评分数据集(data_set),先对数据集进行逐一验证,并整合为数据集合MA,再对MA进行哈希运算,将MA、时间戳、签名等整合为数据集MB,并将MB发送给CSS;CSS对MB中交易数据的签名sigm(a)逐一进行验证,并且比对MA的哈希值,若正确则接受数据集MB。其中,MA是整合过的数据集,sigm()是充电用户对相应数据的数字签名,时间戳是向认证服务器申请获得,Hash()是验证时所用的哈希运算。
算法1用户评分数据上报
Input: {a1,a2,a3,…,am}
Output: 加密后的评分数据MB
Get data_set from charging users
Get Timestamp from certificate server
MA=∅
for each r∈data_set then
if r is legal Then
a=r
MA=MA∪{a}
end if
end for
H(MA) ∶=hash(MA)
MB ∶=MA|sigm(MA.a)|H(MA)|Timestamp
Send MB to CSS
for each a in MA then
if Vsig(pubmkey) = sigm(a) is Ture then
return a
else
Remove a from MA
end if
end for
if Hash(MA)=H(MA) is Ture then
return MA
end if
if Hash(MA)=H(MA) is False then
return ∅
end if
return MB
2.3 区块生成
算法2是区块链的区块生成算法,其中:Chain_id是区块链标志;Block_id是区块标识,由区块链标志Chain_id与区块高度Height构成;index(a)是某一个主体a的编号。为了方便,以mbl表示区块生成者的公钥Pub_key,将公钥Pub_key通过某种运算得到数字签名Dig_sig的这种运算定义为G运算,用Rep(n)表示通过轮盘赌算法选出记账节点。为了防止区块过大,ηm表示某一交易事件中的消息极限,ηM表示区块事件数量的极限。
算法2区块生成
Input:An order number n,
An agent id a
Output:A block b or null
if Rep(n)≠index(a) then
return null
end if
Height=k
Tx_number=m
Pub_key=mbl
Block_id=(Height, Chain_id)
Get Timestamp from certificate server
Get the last block b′:Pre_hash ∶=hash(b′)
Get the digital signature(Dig_sig) from user
Pm∶=∅
Get MB={B1,B2,B3,…,Bm} from message pool:
∀β∈MB:|B|>=ηm∧|MB|<=ηM
for each B∈MB then
if B is legal then
P ∶=B
Pm∶=Pm∪{P}
end If
end for
Γ ∶=mt(Pm)
Merkle_root ∶=root(Γ)
header(b) ∶=(Pre_hash,Tx_number,Timestamp,Block_id,Pub_key,Dig_sig,Merkle_root)
body(b) ∶=Γ
return b
记账节点从信息池里面把未上链的信息MB结合到一起,构成多个相同结构的交易P,并且对此类交易进行逐一验证,再由交易单集合Pm构成块体,即交易树Γ。
2.4 区块验证
算法3为区块验证算法。记账节点a在生成相应的区块b后,需要将区块的(a,b,siga(b))广播至下层区块链网络,先验证siga(b)的合法性,再对区块的内容进行验证。其中,sign(P)为下层链节点整理交易时对交易的签名。
算法3区块验证
Input:An agent id a,
A block b
Output:valid or invalid
Block_id=(Height, Chain_id)
if Rep[header(b).Rep(n)]≠index(a) then
return invalid
end if
for each P in body(b):
if siga(b) is legal then
return valid
else
return invalid
end if
if sign(P) is legal then
return valid
else
return invalid
end if
Remove P from message pool
end for
Get the last block b′
if header(b).Pre_Hash≠hash(b′)
return invalid
end if
Get header(b).Block_id.Height from Block_id
Get Chain_id from Block_id
if header(b).Block_id.Height≠header(b′).Block_id.Height+1
return invalid
end if
if header(b).Block_id.Chain_id≠header(b′).Block_id.Chain_id
return invalid
end if
return valid
验证一个区块是否合法:1) 通过比对index(a)是否与节点相同,验证记账节点是否正确;2) 分别对区块里面的交易P逐一验证,判断交易P是否合法;3) 验证区块高度Height、区块头的哈希摘要Pre_Hash是否由上一个区块计算得出;4) 如果验证通过,则需要将消息P从信息池中除去,避免被其他记账者重复打包,并将其链接至末尾区块。
3 信任机制设计
本文综合考虑用户的主观因素和充电站服务的客观因素两个方面对信用值的影响,通过对这两个方面影响因素的计算,提出基于主客观的信用值的计算模型。
系统中每个充电站的服务器都充当一个区块节点,每个节点的信用值也会随着每个节点诚实程度的变化进行相应的变化。当节点的信用值变高,节点会得到系统相应的奖励。为了督促各个服务器参加验证及记账权的竞争,每次生成区块的节点都将获得出块奖励。
信用值的计算针对节点的自利性进行设计。假设每个节点都是自利的,设立规则:信用值越高则获得记账权的可能性就越大。如果设计的信用值累计函数曲线一直快速上升,那么算力强大的用户将会通过自己的算力垄断记账权的获得;如果函数曲线增长过于缓慢,那么大多数用户将会失去对记账权争夺的想法。所以满足以上要求设计的函数必须满足如下的条件:1)初期信用值缓慢增长;2)一段时间之后,快速增长信用值,鼓励参加共识机制;3)为了防止信用值过高的垄断性行为,信用值从高速增长变为低速增长。
综上所述,系统需要考虑两大因素对电动汽车充电站信用的影响:节点信用TJ和环境信用TE。
3.1 节点信用
用户对电动汽车充电站服务的评分高低,是一种衡量节点服务质量的标准。但是对于不诚实用户的恶意评分,这类数据不能够真实地反映充电站服务质量的好坏,也会对信用值的计算产生严重的影响,所以在对信用值的计算过程中,应当优先考虑节点信用TJ。
3.1.1影响因素
1)评分可信度(THS)
记账节点从区块链中获取用户的历史评分数据(THS′),但是历史评分的可信度会随着时间的增长而降低,因此加入时间衰减因子λ,则
THS=exp(-Δt/λ)THS′
(1)
式中:Δt为此次充电站的用户评分与前一次评分的时间间隔;λ为历史评分随时间衰减的速度,一般设λ=T0/ln2。
2)间接信用(TRS)
间接信用是在电动汽车充电站附近的用户(仅限于区块链记账节点授权的用户)根据用户体验发送的该充电站的推荐评分。一般情况下,记账节点会对信用较高的用户进行授权。
(2)
式中:Ti为推荐用户发送的评分。
3)信用诚实度(TFS)
信用诚实度指的是充电用户给予充电站的实时评分。
3.1.2节点信用值计算
通过对上述因素进行分析,用户主观的信用评分等级如下:
(3)
式中:M为本次评分;Mmin和Mmax分别为最大值和最小值;M0为进行归一处理后的用户评分,其与用户对充电站的满意度成正比。
记账节点在计算交易发送者信用时需要考虑:电动汽车充电站的评分可信度(THS),推荐者Oi提供的一些有关充电站的间接信用评分(TRS),当次充电交易获得的信用诚实度(TFS),具体的计算如下:
TJ= (b1×THS+b2×TRS+b3×TFS) ×M0
(4)
式中:b1,b2,b3分别为各个参数占有的比重,且b1+b2+b3=1。
针对影响因素THS、TRS、TFS的分析,本文主要侧重于THS、TRS,且THS的评分更加客观,因此b1+b2>2/3,取b1>b2,b1、b2的取值范围分别为(1/3, 2/3)和(1/3, 1/2),理论上b3的取值不超过1/3。
3.2 环境信用
3.2.1影响因素
1)客观可信度(TFA)
客观可信度是指充电站历史评分造成的影响。如果充电站长期获得不好的评价,或者长时间信用评分过低,就会导致充电站可信度指标降低。
2)输出电量规模影响(TWR)
输出电量规模影响指的是充电站充电量造成的影响。如果一个充电站充电量越多,那么这个充电站对环境信用值的影响将越大,反之越小。
3.2.2环境信用值计算
环境信用主要是评判充电站自身的信用表现,包括客观可信度(TFA)和输出电量规模影响(TWR)。具体计算如下:
TE=c1×TFA+c2×TWR
(5)
式中:c1,c2为比重系数,且c1+c2=1。
通常情况下TFA的影响更大,因此理论上c1>c2,即c1>0.5,c1的取值范围为(0.5, 0.7],根据c1的值设置TWR的权重系数。
3.3 信用值的计算
综合充电网络的节点信用和环境信用,可以计算出充电站的信用总分:
TC=α×TJ+β×TE
(6)
式中:α,β为各个参数占有的比重,且α+β=1。
对于TJ和TE,虽然TE相对客观,但是TE随着时间的变化不会有很明显的变化,因此本文更加侧重TJ的影响。理论上,α的取值应大于β,即α>0.5。本文对α的取值范围设为(0.5, 0.7],相应可得β的取值范围。
信用值的计算,首先,通过信用评分计算出此次评价的诚实度
(7)
式中:Q为一个固定的值,负责对此次的诚实度进行归一化。
其次,对G次的诚实度进行累加获得总诚实度
(8)
再次,通过信用值计算公式可以得到最终的信用值。
(9)
式中:K为信用值阈值参数,K取值100;P0为常数,为了调节信用分中期高速的上升时间,通常取P0的值为K/2来保证增长的对称性;h为拟合函数的中心位置,负责控制信用分上升的低速期的时间。
对于作弊的客户端,由于本文设计的曲线变化过快,为了惩戒其作弊行为,每作弊一次,诚实度将会直接减为原来的3/5,即ni=3ni-1/5,并将其计入区块链当中。对于反复被认定为作弊的节点,作弊次数达3次及以上5次以下的,将该节点参与记账选举的概率降为原先的一半;若作弊5次,将直接剥夺该节点参与记账选举的权力。
为了防止某些节点因为信用值累计过高而产生的惰性反弹效应使系统趋于中心化,在信用机制中增加了积分重置的功能。若节点的信用值过高且记账次数达到阈值,那么将减半该节点的信用值,这样可以降低信用值过高的节点作恶的概率。
4 基于轮盘赌改进的共识机制
EoR通过结合各个节点的信用值,再使用轮盘赌算法选择出共识产生的记账节点。使用此种方法可以有效地解决基于PoW共识机制的算力损耗以及共识效率上的缺陷,并且使得记账权选举更具有随机性却又不失公平,甚至可以有效地防止心怀恶意的节点违规操作。现有的PoS的共识机制通过对拥有币的多少和币龄计算节点所持有的股份,取最大股份拥有者记为记账节点。目前,很多的研究是使用节点的信用值来替换股份,也就是信用值最大的节点将会取得记账权。在一定程度上,此种方法可以增加节点对记账权的竞争,并且可以防止大多数恶意节点的攻击。但是,当同一节点的信用值过高,那么极有可能使得该节点长期获得记账权,导致区块链系统脱离本该有的去中心化的特征;而且当一个节点长期获得记账权,那么通常情况下大部分的节点也会放弃对记账权的争夺,容易形成节点普遍的惰性思维,不利于系统的长期发展。
本文对于信用值的计算综合了多方面的因素,有助于提高信用值在节点行为规范以及品行等各个方面的表现,可以极大可能地认为信用值高的节点更加可信;但是为了防止由于信用值过高导致系统中心化、节点丧失对记账权竞争的信心和高信用节点受贿等问题,将轮盘赌与信用值相结合,并且选取出最后的记账节点。
在记账权选举过程中,各个节点被选中的概率为Pi,Ti为信用机制求出的信用值,q[j]为对节点记账权获得概率排序之后前j个概率累计。其中:
(10)
(11)
q[j]对应的概率累计分布如图5所示。
图5 概率累计分布Fig.5 Probability cumulative distribution
通过轮盘赌策略获得记账权的流程如图6所示,具体如下:
1)所有节点都可以在给定的时间段内参加记账权的争夺。
2)计算所有参与记账权争夺的节点总数。
3)通过公式计算每个节点的参加记账权争夺时的信用值。
4)计算所有节点的信用值总和。
5)对各个节点被选中为记账权获得者的概率进行计算,并对其概率排序。
6)在[0,1]区间内产生一个均匀分布的伪随机r。
7)若r<=q[1],则选择节点1作为记账节点;否则,选择节点k,使得q[k-1] 8)代理节点选择结束。 图6 记账权选举的流程图Fig.6 Flow chart of bookkeeping right election 在一定程度上,基于轮盘赌策略的共识机制可以增加记账权选举的随机性,而且对信用值高的节点又不失竞争性;节点的信用值越高,获得记账权的概率越大,但不一定能够获得记账权。 当少部分的恶意节点希望联合作弊,就有可能使得区块链出现分叉的现象,或者各种的网络故障也会使得网络不同步而出现分叉现象[15]。此时,系统可以采用双向的确认机制,由记账节点统一上一轮的合法区块记账节点的认可数,根据多者胜出的原则,将两个区块合并到统一的区块链中[16],如图7所示。 图7 防止网络故障区块链硬分叉Fig.7 Preventing blockchain hard fork in network failure 在正常网络下,选取的是H节点作为区块记账节点,另外4个节点为普通节点,这里统称为普通记账主节点A。在故障网络下,D节点为区块记账节点,C为普通记账主节点。从图7可以看出:正常网络中的节点H,获得区块生成的赞同票数为4;而节点D在故障网络中,它取得的票数是2。因此,节点D生成的区块为不合法的区块,需要将此区块抛弃,并将区块内的内容同步到主区块链当中。 当节点的信用值达到一定的阈值时,将会更容易获得记账权,不排除节点贩卖记账权等恶意行为。本文设定初始7个节点,对相同节点分别使用与未使用轮盘赌策略时获得的记账权概率进行比较分析,如图8所示。 图8 获得记账权的概率比较Fig.8 Comparison of acquisition probability of bookkeeping right 从图8可以看出:无论是否使用轮盘赌策略,节点获得记账权的概率都在稳定增加,我们可以认为此节点为信用较好的节点。但是,随着记账权选举次数的增加,在第500次选举时,未使用轮盘赌算法的节点获得记账权的概率接近0.9,其极有可能会垄断记账权的获得;而此时使用轮盘赌策略的节点获得记账权的概率未到0.25。而且本文仅设定7个节点参与选举,单个节点获得概率会相对偏高,但使用轮盘赌算法之后,节点之间的竞争更加公平,可以很好地防止系统记账权被垄断,也能更好地防止恶意节点通过对节点攻击获得记账权的行为。因此,本文设计的方案是安全可靠的。 通过调节节点信用和环境信用的权重系数,对节点的评估信用做了信用好、信用一般和信用差的3组实验,信用综合评分直方图如图9所示。对于信用好的充电站,节点信用比重较大,环境信用比重较小;对于信用一般的充电站,节点信用和环境信用占有相同的比重;对于信用差的充电站,节点信用比重较小,环境信用比重较大。 从图9(a)可以看出:信用好的充电站获得的信用评分基本都稳定在80分左右,由此可以推断出在比较理想的时候,信用好的充电站信用值上升得很快。从图9(b)可以看出,信用一般的充电站获得的评分主要集中在60~70分。因为充电站信用一般,获得的评分较低,所以信用一般的充电站的信用值上升较为缓慢。从图9(c)可以看出,信用差的充电站获得的评分主要集中在25分左右,可见其信用值评分增长非常缓慢。因此,本文的信用机制可以体现充电站的总体信用。 传统信用目前使用较为广泛,其仅对赞成或者归一后的信用分进行直接的叠加,但不适用于本文对记账节点的选举。本文对这2种信用方案进行了200次信用分累计的比较,如图10所示。 由图10可以看出:传统信用的曲线接近直线,信用分的累积速度较快且没有极限,极易出现信用分过高垄断记账的风险;由于信用分一直增高,会造成后进入系统的用户丧失竞争力。而优化信用机制在用户刚进入系统时,为了判定用户是否积极工作,信用分增长相对缓慢;而当信用分到达20时,为了使积极工作的用户更具备竞争力,则进入快速增长时期;当信用分到达80后,为了防止垄断,则降低增长速度。相较于传统的信用累计方式,本文设计的信用机制更适用。 (a) 信用好 (b) 信用一般 (c) 信用差图9 信用综合评分直方图Fig.9 Histogram of composite credit score 图10 信用方案比较Fig.10 Comparison of credit schemes 本文共识机制的记账权选举采用轮盘赌算法。 无论是基于上层链还是下层链,如果不是通过挖矿进行记账权选举,那么对系统的运算能力及其配置要求将会大大降低。 如果单纯地给共识节点分配序号或者随机选举记账节点,那么会对系统整体的安全性造成巨大的影响。如果只是分配编号,按照编号直接选取下一个记账节点,那么容易造成节点作弊和其他节点贿赂的现象。如果是随机选取记账节点,则会容易造成大部分节点的惰性思维,使得系统缺乏竞争力。 为了消除这种影响,将记账权的生成与信用值相结合,并且尊重能者多得的思维,采用轮盘赌算法对记账权进行选举。本文进行了初始信用值为-5,0,10的3组实验,每组实验随机生成了7个节点,分别进行500次的记账权选举,对相同初始信用值不同信用情况下的记账权获得次数进行比较,如图11所示。由图11可以看出:信用值较低的节点依旧有被选为记账节点的机会,但是获得记账权的机会却远低于信用较高的节点。 (a)信用初始值(-5) (b)信用初始值(0) (c)信用初始值(10)图11 记账权选举比较Fig.11 Comparison of bookkeeping right elections 由于一些客观的因素,在一条区块链中产生一些时延必不可免。从区块生成到区块上链之间的时间都属于区块的时延。对于一些双层链来说,特别是上层链,由于需要对下层链中的数据进行提取,使得区块的时延在上层链中显得十分重要。 本文提出的双层链中的下层链按照地域分布,下层链的数量不止一条。上层链的节点如果同时接收多个下层链的信息,会增加上层链的时延,其包括区块信息提取、整合和哈希计算等时间,称为共识时延。 图12 区块共识时延Fig.12 Block consensus delay 图12是上层链主节点对下层链不同大小数据产生的共识时延。区块共识时延以产生一个128 KiB大小区块为一个单位时间,对其他大小区块生成的延时分别取50次总时间的平均值。由图12可以看出:时延长短随着下层链区块的大小呈正相关变化,区块数据越多,时延越明显;当不同下层链同时上传上层链时,时延变化显著;相对下层链中每个区块的大小而言,下层链同时上传区块的数量越多则延时更加明显。为了降低上层链同步消息的时延,应当适当地扩大下层链区域,以图12的分析来看,下层链区域在4~7个时最为合适。 1)本文提出了一种基于区块链的电动汽车充电站信任机制,以用户的主观评分和充电站的客观评分为依据,组建了一个能够反映电动汽车充电站服务质量、用户满意度等行为的信任指标;采用了双层链的结构,在保留信任度凭证的同时,降低了大部分CSS的负荷,加快系统的检索与响应速度;将轮盘赌算法与共识机制中记账权的选举相结合,不仅能够增加选举的随机度,还能有“多劳多得”的效果;不仅可以激励各个主节点有规律的工作,也能减小因为信用值低而丧失对获得记账权节点的不作为。 2)本文的方法不仅能够解决中心化存在的中心攻破等问题,还为架构节约了中心结构所需要的成本;另外取消了区块共识中的挖矿机制,使用类轮盘赌的方式对记账节点进行选举,使得各个节点相对公平。5 安全性分析
5.1 防止区块链硬分叉
5.2 防止记账权垄断
6 实验结果分析
6.1 优化后的信用评分
6.2 优化信用与传统信用比较
6.3 记账权选举分析
6.4 共识延迟分析
7 结论