目录
前言
文献阅读-《一种流域非点源水环境污染的时序型深度学习模型研究》
核心问题
概念介绍
处理技术
操作过程
工程部分-某禽类养殖追溯项目
主要技术:区块链
区块链的概念
比特币
比特币中密码学原理
比特币的数据结构
代码部分
总结
本周主要围绕区块链相关知识展开学习。文章结构内容包括文献阅读,工程,代码几部分构成。
本周学习的材料是本人工作室前辈的研究成果,下面简单提一下自己学习到的知识。
由于复杂的自然情况造成非点源污染,非点源污染是水体污染物的重要来源,并且污染物传输扩散机理复杂,导致难以处理。
非点源污染是指在流域范围降雨的淋洗和冲刷作用下,污染物大面积的通过径流汇入受纳水体引起的水体污染。降雨径流是主要驱动因素来产生非点源污染,而下垫面是降雨转化为径流的介质基础。降雨径流产生的污染物变化是由雨量大小、土地利用类型、地形坡度及植被覆盖度等空间因素共同影响决定的。
用VGG模型提取数据,用LSTM模型来训练学习模型,最后以RMSE、MAE和MAPE作为评估参数,通过实验进行参数优化,并通过模型对比进行效果验证。
1.降雨产流过程中,利用深度学习模拟流域内污染物随其形成的物理过程,首先要明确的是污染物受哪些空间因素影响。
2.利用改进型的卷积神经网络VGG模型,来研究空间面数据对污染模拟的影响。
3.流域内,考虑污染物在水流方向上的扩散分析,将目标站点上流的站点简化为水质污染物的发源地,利用Hec-ras建立多源水体扩散模型。污染物浓度在水环境中的一维变化是对流、分散和自然净化三种作用的结果,当水环境中这三种过程同时发生时,通过模拟水质污染物的扩散过程对目标站点的污染物浓度进行预计算
4.基于LSTM实现误差修正这一目标,利用过去几个小时的水文气象指标、其他污染物指标、空间面数据特征指标以及目标污染物误差,预测下一时刻的污染物误差。
今天主要来学习一下该项目中使用到的技术-区块链
狭义区块链是按照时间顺序,将数据区块以顺序相连的方式组合成的链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。广义区块链技术是利用块链式数据结构验证与存储数据,利用分布式节点共识算法生成和更新数据,利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约,编程和操作数据的全新的分布式基础架构与计算范式。
比特币只是基于区块链技术的一种加密货币而已。
比特币主要用到了密码学中的两个功能:1.哈希函数2.签名
哈希函数(cryptographic hash function)的重要性质:
1.collision(哈希碰撞) resistance
例如x≠y H(x)=H(y) 两个不同的输入,输出却是相等的,这就称哈希碰撞。它是不可避免的,因为输入空间总大于输出空间。给出x,很难找到y,除非蛮力求解(brute-force)。
该性质的作用:对一个message求digest
比如message取m,m的哈希值是H(m)=digest 如果有人想篡改m值而H(m)不变,则无法做到。
哈希碰撞无法人为制造,无法验证,是根据实践经验得来的。
2.hiding
哈希函数的计算过程是单向的,不可逆的。
性质前提是输入空间足够大,分布比较均匀。如果不是足够大,一般在x后面拼接一个随机数,如H(x||nonce)。
该性质的作用:和collision resistance 结合在一起,用来实现digital commitment(又称为digital equivalent of a sealed envelope)
把预测结果作为输入x,算出一个哈希值,讲哈希值公布,hiding让人们知道哈希值而不知道预测值,最后再将x公布,因为有collision resistance的性质,预测结果是不可篡改的。
3.puzzle friendly
指哈希值的预算事先是不可预测的。
比特币是区块链,区块链是由一个个区块组成的链表,每个区块有个块头(block header),block header里面有很多的域,其中有一个域是我们可以设计的随机数nonce。挖矿的过程就是不停的趋势各种随机数,使得block header 取哈希之后落在指定的范围内,小于等于一个target space。
比特币挖矿的过程中实际就是找一个nonce,nonce跟区块的块头里的其他信息合一起作为输入,得出的哈希值要小于等于某个指定的目标预值。H(block header)≤target。
比特币中使用的哈希函数叫做 SHA-256。(SHA:secure hash algorithm)
在比特币系统中开账户:
在本地创立一个公私钥匙对(public key ,private key),这就是一个账户。公私钥匙对是来自于非对称的加密技术(asymmetric encryption algorithm)。
签名用的私钥,验证签名用的公钥。
哈希指针(hash pointers)
普通指针存储的是某个结构体在内存中的地址。假如P是指向一结构体的指针,那么P里面存放的就是该结构体在内存中的起始位置。而哈希指针除了要存地址之外,还要保存该结构体的哈希值H()。
比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表。区块链和普通的链表的区别:
1.用哈希指针代替了普通指针(B block chain is a linked list using hash pointers)
区块链第一个区块叫作创世纪块(genesis block) ,最后一个区块是最近产生的区块(most recent block) ,每一个区块都包含指向前一个区块的哈希指针。
一个区块的哈希指针怎么算?
是把前面整个区块的内容,包括里面的hash pointer ,合在一起取哈希值。通过这种结构,可以实现tamper-evident log。如果有人改变了一个区块的内容,后面一个区块的哈希指针就对不上,因为后一个区块哈希指针是根据前一个区块的内容算出来的,所以后一个哈希指针也得改,以此类推,我们保留的是最后一个哈希值也会变化。
好处:只要记住最后一个哈希值,就能检测出对区块链中任何部分的修改。
Merkel tree
这种结构的好处:只要记住根哈希值,就能检测出对树中任何部位的修改。
比特币当中各区块之间用哈希指针连接在一起,每个区块所包含的交易组织成一个merkle tree的形式,最下面一行data blocks每个区块实际上是一个交易,每个区块分为两部分,分别是块头和块身(block header ,block body)。块头里面有根哈希值,每个区块所包含的所有交易组成的merkle tree的根哈希值存在于区块的块头里面,但是,块头里没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。
merkle tree 的作用:提供merkle proof
比特币中的节点分为两类:
全节点(保存整个区块的内容,即块头块身都有,有交易的具体信息)
轻节点(例如手机上的比特币钱包)(只有块头)
这时存在一个问题:如何向一个轻节点证明某个交易是写入区块链的
这时需要用到merkle proof :找到交易所在的位置(最底行的其中一个区块),这时该区块一直往上到根节点的路径就叫merkle proof。
本周对于代码部分的学习还是太欠缺,没有什么好的内容可以写,希望下周可以写出一点内容。
总的来说,本周的学习还是非常充实的。知识存储上基本了解了一些简单的比特币中涉及区块链的知识。通过前辈的材料,对于解决问题,处理问题的思路有了更明确的方向。美中不足是个人在代码方向比较欠缺,希望在下次总结的时候可以在代码撰写方面有一些提高。