社区
Enterprise Architect
帖子详情
多表查询出来的一个字段,该字段有很多条数据。现在要把查询出来该字段的所有数据,都更新到另一张表的一个字段。怎么解决?求助
代天龙
2016-10-18 10:56:44
多表查询出来的一个字段,该字段有很多条数据。现在要把查询出来该字段的所有数据,都更新到另一张表的一个字段。怎么解决?求助
...全文
898
2
打赏
收藏
多表查询出来的一个字段,该字段有很多条数据。现在要把查询出来该字段的所有数据,都更新到另一张表的一个字段。怎么解决?求助
多表查询出来的一个字段,该字段有很多条数据。现在要把查询出来该字段的所有数据,都更新到另一张表的一个字段。怎么解决?求助
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
代天龙
2017-03-28
打赏
举报
回复
已经解决了
Justin-Liu
2016-10-19
打赏
举报
回复
SQL语句不会写?
百亿级
数据
10万
字段
属性的秒级检索
解决
方案以及实现
平台型创业型公司,会有多个品类,像生活信息服务类网站的有:58同城,赶集网等等,他们的类别非常多,每个垂直领域都会分为很多类别,每 个类别下又分很多子类别,每个类别或者子类别的属性都不一样,像这么庞大的
数据
,
字段
属性可以达到10万级别,同时
数据
量可以达到百 亿级别 ,很多异构
数据
的存储需求。基于这么庞大的
数据
,我们需要达到秒级
查询
。那么我们该怎么设计呢?本课程讲手把手带大家一步一步去实现这个项目,从简单到复杂,不断演进。通过方案讲解以及代码实现,让大家清晰的学习该类系统的设计思想。该项目是一个可用的项目,商业价值极高,大家可以根据自己企业的需求,稍加改动就可以用到自己的项目中去。开发工具:IDEA本课程用到技术:Spring Boot 版本:2.0.2.RELEASE、Spring Cloud 版本:Finchley.RELEASEKafka、Redis、Zookeeper、Elasticsearch、JPA等
0行代码写服务服务-服务发布-调用
通过该课程的学习,掌握0行代码写服务框架的服务发布,参数验证,代码生成功能,具备初步的使用能力 该项目本身设计的内容非常多,后期会逐步开放讲解框架后期内容参考:https://mp.csdn.net/editor/html/112142371与Springboot+mybatis和Springboot+jdbctemplate对比:https://editor.csdn.net/md/?articleId=106091083框架主要功能:生成自定义sql模板文件1.一键生成
数据
库所有列
表
增、删、改、查接口通过代码生成器,一键生成增、删、改、查代码,分为有代码和无代码两种方式。有代码方式可以在需要业务封装时直接调用生成的代码进行业务组装。有代码方式和无代码方式都可以直接调用访问。2.可指定单
表
生成接口可以指定生成那张
表
的
数据
接口,以免对已有接口造成影响。3.一键生成接口测试postman调用文件生成postman调用接口,直接导入即可测试,不需要单独也写接口文档,也不需要使用swangger在代码中单独增加注释。
字段
长度类型,大小一目了然。4.可生成controller、service、dao、model、自定义sql、postman测试文件可以根据实际需要进行单独配置5.接口任意参数可自动配置多维度验证比如一个参数phone,在不需要编程的情况下,可以配置验证是否为空、长度、是否是电话号码6.
数据
接口可以任意组合形成新的接口比如、
查询
学校是一个接口、
查询
城市是一个接口,通常情况下在前端是需要两次请求,
现在
可以通过一次请求自动合并两个接口的
数据
结果,一次性返回。而这样的组合可以是无限个组合。7.所有接口参数均可自动封装比如
查询
省份接口,里面有10个参数,前端传入几个参数,便可自动封装几个参数。8.所有
查询
接口自带分页列
表
查询
,有码方式和无码方式,均自带分页。9.通过简单sql的编辑即可完成服务发布只要会写sql便可生成服务,不需要任何多余操作10.接口可以进行限流配置,可以根据ip、token、ak进行限流操作多维度自定义限流,可设置次数、时限、限流方式11.所有接口可以进行签名认证所有接口通过接口sign签名认证12.所有接口可以进行登录认证限制,也可单独配置不需要登录认证可以指定接口单独授权不需要登录验证,比如验证码接口13.所有接口均可设置需要验证码验证所有的接口都可以通过参数配置设置短信验证码和图片验证码14.所有
查询
接口均可单独设置缓存所有接口皆可设置单独缓存,缓存周期15.所有接口均可监控访问次数同一接口访问次数记录,很容易监控服务访问,可以做更细致的服务优化16.所有接口均可记录访问日志,包括请求来源请求参数、获得结果入参出参所有访问皆有详细记录17.项目中的代码可以进行自动统计代码量一键统计代码量,包括前后端代码行数和体积18.可以自动进行
数据
统计,可配置单
表
数据
量统计、也可以配置定时任务
数据
统计自动
表
数据
统计,方便做BI可视化报
表
,不需要开发直接配置即可19.可进行跨域设置跨域通过配置文件配置20.可进行IP禁用对于恶意访问ip进行封禁21.可进行访问次数限制所有接口可以进行访问次数限制22.可进行访问来源设备、应用检查验证验证请求来源所用设备和请求发起的应用
OpenGL-自主高性能三维GIS平台架构与实现-第二季
OpenGL-自主高性能三维GIS平台架构与实现/第二季:实现三维GIS球体+ 高程
数据
章节名称DEM基础1DEM基础知识1.介绍基本的DEM知识2.什么是DEM,作用是什么2DEM
数据
1.如何获取/ 传统测量/激光扫描/无人机测量/ 点云
数据
/ 倾斜摄影2.如何使用/局部小规模(栅格
数据
,图片/tif),3. 组织方式4. 根据使用目的不同,介绍多种优化方法3DEM图层的实现原理14DEM
数据
结构定义struct V3U3N4顶点
数据
的生成和计算WGS84投影计算5wgs84 投影球体被切成一个个小圆弧,一共60个投影带,分别为01,02.........60WGS的最新版本为WGS 84(也称作WGS 1984、EPSG:4326),1984年定义、最后修订于2004年。接口定义坐标转换Wgs84
数据
加载6瓦片编号计算生成算法1. 经纬度到大地坐标的转换2.大地坐标到经纬度坐标转换3. 根据经纬度获取瓦片编号框架重构7智能指针重构框架1. 基类定义(所有的类继承自基类),基类派生自 std::enbale_shared_from_this2. 实现智能指针的动态转换接口3. 实现向下转换4. 已有的类实现全部使用智能指针重构5. 任务系统(多线程加载任务)8引入图层(Layer)1. 介绍图层的概念以及重要性2. 图层类实现3. 修改框架(使用图层的方式重构框架)9Layer-bug排查(绘制过程中出现错位,偶发)1. 框架重构后遇到问题(绘制结果错误)2. 瓦片索引方式发生变化,多线程中引起内存问题3. 修改索引方式,
解决
绘制偶发错误问题10引入
数据
源(TileSource)1.
数据
源的作用与设计目的2. 当前存在的问题,
数据
调度中存在问题3.
数据
源(TileSource)类实现11
数据
格式管理(FormatMgr)1.
数据
格式管理(FormatMgr) 提出的目的,需要
解决
的问题2. CELLFormat基类接口抽象3. 实现几个标准格式类4. 修改框架流程,使用FormatMgr重构流程5. 扩展支持,后续支持任务格式
数据
加入系统12Task(任务)优化1. 任务中低耦合
数据
结构,目的是让Task更加的通用2. 修改任务读取代码与任务处理代码,完善处理流程DEM高程13DEM-数字高程定义1. 什么是数字化高程
数据
2. 当下GIS系统中有哪些常见的高程格式3. 课程体体系中使用的哪种格式4. 高程类定义以及实现,并加入到FormatMgr 管理系统中14高程瓦片
数据
读取1. 介绍GIS系统相关的工具(在
数据
转换)
数据
生成方面可以
解决
大量时间2. 自定义高程瓦片格式说明3. 自定义高程格式文件解析,并以智能对象的方式引入到系统中4. 完善框架代码,适配高程
数据
15高程瓦片文件的读取1. 实现基本的读取算法2. 增加格式化组件,并加入到系统中3. 配置高程图层以及高程
数据
源,并加载
数据
,验证
数据
正确性16瓦片
数据
结构重构1.顶点生成2.UV坐标计算3.面
数据
生成17DEM重构绘制流程1. 修改绘制
数据
结构,去除无用
字段
2. 增加Mesh类,实现光栅
数据
转换成三角面
数据
,计算UV
数据
,提炼接口3. 修改系统调度,实现顶点
数据
,UV
数据
,以及面
数据
的生成与更新4. 按需更新
数据
,而不是每一帧更新18DEM-
数据
精度问题(CPU)1. 因为瓦片
数据
使用大地坐标作为系统输入,造成瓦片坐标很大,单浮点
数据
精度不够2. 使用局部坐标的方式
解决
单浮点精度问题3. 调整相机参数,
解决
投影矩阵
数据
计算深度精度问题4. 修改绘制shader 实现对瓦片
数据
的绘制19DEM-
数据
精度问题(LogDepth)1. 使用对数深度(log depth )算法在GPU中 计算
解决
单浮点经纬计算问题2. 修改shader ,增加对(logDepth)算法支持3. 修改C++端代码,实现对shader
数据
的输入20DEM-
数据
结构优化1.当下使用CPU端
数据
通过接口的方式传递给GPU,速度慢2. 使用Instance 方式降低Vertex Buffer 的大小,优化渲染系统21DEM-GPU缓冲区优化1. 使用Vertex Buffer Object / Index Buffer Object / Instance 方式优化渲染系统2. 修改绘制接口,使用DrawElementsInstanceBaseInstance方式提升系统性能内存池与对象池22瓦片生成优化/对象池1. 相机移动过程中会频繁的建立与释放瓦片,对CPU有较大的消耗2. 引入内存池,避免频繁的内存申请与释放,降低CPU时间3. 改造智能指针对象,对象释放通知到内存管理,回收对象内存23改造任务系统支持对象池1. 任务系统是一个公用模块,被多个模块使用,避免频繁的内存操作,引起的内存碎片2. 实现对象池,并应用到任务模块法线计算24法线计算1. 修改现有顶点结构,增加法线支持2. 修改shader,增加法线顶点输入,使用平行光光照模型3. 修改绘制流程,支持光照计算,使用探照灯作为光源输入25顶点法线计算/共享法线计算1. 增加
数据
结构保存顶点
数据
被多个面共享的次数2. 计算面法线,并累加到顶点法线中3. 根据顶点被面共享的次数做平均法线计算4. 修改流程,按需更新法线
数据
26法线
数据
压缩1. 法线
数据
使用3 * float
数据
存储,大大的增加了系统的
数据
2. 实现算法,将3 * float
数据
压缩成4字节
数据
3. 改造绘制代码,支持压缩
数据
输入27GPU中计算产生法线
数据
(去掉CPU中计算)1. 引擎支持 Geometry Shader 阶段2. 编写 Geometry Shader,实现法线计算系统功能优化28重构CPU拾取流程1. 当下的拾取流程,只支撑二维
数据
拾取,无法准群的拾取三维
数据
2. Terrain中增加拾取接口,输入射线,输出拾取到顶点
数据
29绘制拾取结果1. 增加一个绘制点的方法,实现绘制代码2. 修改shader,增加logdepth3. 调试代码,花费了很多时间排查错误,最总排查到是因为uniform参数笔误写错造成。30任务系统完善,避免任务队列无线膨胀1. 任务系统中,没有限制队列的大小,生产者的能力远大于消费者的能力,造成任务队列膨胀2. 处理办法,限制生产者的生产能力,而不是限制任务队列大小(这种方式会造成业务逻辑异常复杂)3. 使用sleep休眠方式(这种方式是严重错误的)31如何避免瓦片
数据
抖动1. 产生瓦片抖动的原因 ? 分裂算法与回退算法中间没有过度2. 引入过度流程,避免内存抖动,参数因子是一个重要的
数据
,需要谨慎使用3. 有必要结合瓦片自身
数据
动态计算参数因子32瓦片
数据
管理-fepk文件格式支持-全球
数据
加载1. 支持fepk文件格式,增加fepk读取组件,适配fepk文件2. fepk管理
数据
方式:一般情况选择全球前10级别作为基础级别,因
数据
量不大(1G)左右,后续以8级作为基础级别,全球19级别
数据
被划分为 2^8 * 2^7(512 * 256)个块。每个块中包含了256 * 256 张小瓦片33fepk高程
数据
读取 34高程分裂处理当瓦片没有高程
数据
,那么子节点以及其他后代节点该如何共享父节点的
数据
35lesson-734-高程瓦片分裂处理(2)-算法实现高程
数据
分裂算法实现实现对高程
数据
的切分,并对特殊
数据
进行处理36高程瓦片分裂处理(3)-问题排查 37高程瓦片分裂处理(4)-(后代节点更新问题)当一个瓦片高程
数据
更新后,他的儿子节点,孙子节点...该如何处理?38瓦片视锥裁剪错误高程
数据
更新后,没有技术计算瓦片包围盒信息,造成包围盒错误,进而引视锥计算错误39http支持1.引入三方库 Libcurl2.http类封装,支持http读取
数据
40fepk.server使用 生成三维地球41改造四叉树-统一使用经纬度输入42地形网络生成算法重构 43引入球体坐标系 44使用球体坐标改造瓦片 45多图层(加载标签
数据
) 课时截图:镜头拉近后,显示细节
数据
加载矢量SHP国界线
数据
:加载矢量三维白膜
数据
截图高程
数据
加载点云
数据
加载倾斜摄影
数据
MySQL8从基础到高级
你能获得:快速掌握MySQL的基础语法、
数据
库、
表
设计。高效精准的掌握增删改查语句,
字段
控制
查询
,多
表
联查,子
查询
等高级操作,为开发打下夯实基础,准确通过MySQL面试必问知识。教学服务:实战驱动远程协助课后答疑教辅资料学习群答疑面试指导讲师介绍: 菩提老师吉林大学毕业,Java资深研发工程师。8年+Java研发与授课经验,主导过多个大型企业实战项目。曾任职知名IT培训机构讲师,授课通俗易懂,风趣幽默,对学员有很强的责任心和耐心。累计教授学员500+,就业率99%+,学员好评率99%+课程简介:本课程是菩提老师的《Java零基础到高薪架构师》系列课中的课程。也支持单独学习,能够帮助同学们快速的掌握重点核心的知识技术,具有颇高的实际工作价值,快速达标企业级开发要求,课程内容结合实战开发,以实战编码验证理论的教学方式深受学员喜欢,讲师的大量过往学员就业
数据
显示,简洁清晰的授课思路,有利于学员理解、掌握、学会课程,从而更容易就业或涨薪。适合人群:1、爱好编程,想通过编程来工作挣钱的人士 2、大学生,增加技术实例,做出高大上的项目 3、在职人士,提高自身技术实例,加薪升职 4、想转行学习Java的必修课
区块链之实战VM虚拟机开发
智能合约虚拟机赋予了区块链运行去中心化应用(Dapp)的能力。它让区块链演化为“操作系统”,孕育出繁荣的Dapp生态。一款优秀的VM不仅仅是要完成确定、高效、安全地执行合约字节码的功能,它应该足够通用,能最大化节省开发者的成本,甚至能形成独立的开发者生态。从架构上来说,VM为智能合约提供计算资源和运行容器,区块链的共识、执行模块与VM是完全解耦的。在区块链2.0项目中,我们看到大部分项目将VM作为区块链项目的一个子模块,一同编译进二进制中;Fabric更进一步,链码被编译成独立的程序,运行于独立的docker容器中,通过grpc与节点交互。如此,可将
数据
与逻辑彻底分离;在未来,VM可能以硬件的形式安装在“矿机”中,通过更底层的如PCIe接口与区块链进行通信。业界的Nervos CKB使用RISC-V实现VM,为演化成硬件模块做准备。架构设计验证层验证层会对合约字节码及传参进行一些验证,包含ABI验证,环境检查与版本检查三个环节。ABI验证:利用合约ABI对用户发送的合约调用及参数进行校验。环境检查:检查虚拟机执行环境是否符合预期检查Config
字段
。字节码是否合法。exports是否包含apply与memory,以及类型是否正确;是否包含start(被禁用);是否包含import,import的模块是否合法。解释器模块是否ready。版本检查:检查合约版本,选择对应版本的解释器。注入层注入层主要对合约字节码注入一些必要的代码,以及构建相应的执行上下文。Gas MeteringGas metering是用于统计每一个操作所须花费的Gas。原理非常简单:实现Env_api方法useGas。将wasm字节码恢复成易于解析的格式化文本(如JSON)。将useGas注入到格式化文本中将格式化文本重新恢复成wasm字节码。这里有一个值得考虑的问题:**Gas Metering能否放到编译期去做?**在编译器做Gas metering注入的好处是只须要注入一次,节省了执行时的开销。但这样的弊端也很明显:Gas Table本属于区块链协议的一部分,但却被放到合约编译器中,恶意用户只须要更改编译器的Gas Table即可完成作恶,作恶成本大大降低。若Gas Table需要修改,无法再对已部署的旧合约更新Gas Metering,导致新老合约的Gas收费标准不一致。在每次执行时进行一次Gas Metering注入,虽然牺牲了一些执行效率,但换来了Gas灵活变更的特性,这对于不断调整、迭代的公链项目是至关重要的。一种更好的方案,是将Gas Table以合约形式部署,无须硬分叉便可更改Gas Table的参数。Env API 注入Env_api是区块链提供给合约层用于与区块链进行交互的接口。注入原理如下:合约字节码(wast)中包含形如(import env getAddress (func ...))的代码段。意为从env模块中导入getAddress函数。env模块从哪来呢?由虚拟机利用解释器的API构建原生模块,并实现预先设计的Env_api。这里的Env_api都须要用原生语言实现。利用解释器的moduleResolver在执行代码前注入。经以太坊基金会Go-team的gary推荐,这里隆重介绍下EVMC这个项目。它提供了一套虚拟机和客户端之间的通用交互接口。不同的VM只需要实现这些接口,即可为以太坊客户端提供交互功能。如此将客户端与虚拟机实现相互分离,更能够根据实际情况灵活切换底层虚拟机实现。上下文构建我们还需要给合约执行构建合理的上下文环境,提供必要的内部模块和
数据
以供合约使用,包括:区块链账本实例,提供区块、交易等信息的调用接口。状态
数据
库实例,提供状态
数据
的增删改查的调用接口。当前Transaction与Action的相关
数据
。当前区块高度和区块时间。执行层执行层是虚拟机的核心模块,负责执行合约字节码并返回结果。它必须具备以下几个特性:确定性:即相同入参和上下文,无论在什么设备上运行,何时运行,运行几次,都必须获得相同结果。高效执行:虚拟机的执行时间不大于共识算法给于交易执行的最大时间。停机与回滚:须要有相应停机机制。在执行失败时须要对本次执行涉及的所有状态变更进行回滚。沙箱环境:即保证合约与合约之间、合约与宿主系统之间的资源隔离。能够防备恶意和故障合约的不良影响。Apply执行合约字节码,实际是调用合约代码中的apply函数。合约上下文,包括用户指定调用的合约方法名和对应入参,通过Env_api在实际apply实现中获取,最终调用相应的合约方法。栗子详见系列第二篇。Memory合约除了应导出apply函数外,还须要导出memory对象。memory对象是wasm编译器在合约编译时自动注入,通常会开辟一页内存(64KB) (memory $0 1)。解释器会初始化一个线性字节数组作为内存供wasm使用,wasm与区块链
数据
交互是依靠内存共享的形式,通过该字节数组进行传递。(这也是为何在Env_api设计里,很多数值的传参是offset与length的组合)Wasm的内存数组是按照| static memory | dynamic memory |的次序划分,static memory中存放编译期的字符串或数组,dynamic memory用于运行期的
数据
存储,并且可以动态扩容。为了防止dynamic memory无限制地扩容,需要有合理的收费机制与内存分配上限。AssemblyScript提供了一个额外的位于static memory之前的预留空间,称为reserved memory。这使得我们在运行期可以将一些变长
数据
(如字符串,数组等)以Global的形式导入wasm。这样wasm无须调用Env_api即可直接使用上下文的变量,如发送方、接收方、合约地址、当前调用的合约方法名等。状态存储对VM最本质的需求是对状态存储的需求,这种存储是达成共识的、不可逆的,从而实现了去中心化应用中
数据
的信任存储。Ethereum1出现的状态爆炸问题给我们敲响了警钟——只收取每一次读写操作的费用,而不收取占用存储的费用,是不合理的。如果不对占用存储收费,则用户可以无限制地占用区块链的稀缺存储资源;且由于没有好的
数据
清理机制,区块链的状态就会不断增长,即所谓“爆炸”。状态存储付费是很自然想到的方案。如何设计合理的状态存储付费方案,有两个底层逻辑需要考虑:用户应当为占用链上的稀缺存储资源付出成本。这里的成本是广义的,可以是代币价值、机会成本与承担额外风险等形式。状态存储的使用属性最大化,投资属性最小化。须要避免出现用户大量囤积存储资源,提高资源利用率。EOS使用【RAM】来
解决
状态收费的问题。开发者须要使用代币向系统合约购买RAM,存储状态
数据
须要消耗对应大小的RAM资源,当
数据
删除时RAM资源也会相应释放,并且可以卖回给系统拿回代币。但开发者须要承担RAM和代币价值波动风险。如何对RAM定价呢?EOS创新性地引入了Bancor算法对RAM进行模拟市场定价。Bancor算法有两个特点:数字货币价格取决于存储金金额和代币流通量,真实模拟了市场供需关系;人机交易,无须对手盘,这使得“巨鲸”可轻易做多或做空,导致价格波动剧烈。也正因为上面两个特性,EOS主网刚上线时,出现了大量RAM资源被囤积,RAM价格被瞬间拉至高位,又在随后的一周内快速下降,造成了“割开发者韭菜”的情况。V神在2018年曾提出过使用【状态租金】来
解决
状态爆炸问题。状态租金很像当前云计算服务的商业模式,用户不仅花费购买占用空间大小,还须购买占用时间。对于状态租金方案的具体设计,我们仍然须要考虑以下几个问题:用户体验:当状态出租时间快到期时,如何提醒用户续费?时间到期后状态
数据
是否立马清除?不同级别的
数据
是否有区别的对待?(云服务厂商都会提供到期后的赎回期,以防止关键
数据
被意外删除)支付对象:哪些
数据
需要支付租金?除了合约的状态
数据
必然要支付租金以外,账户本身的元
数据
(balance, nonce等)是否也要付租金?如果需要,时间到期后清零,势必损害用户的资金安全(与区块链保护数字资产的理念相背),同时nonce为0后可能会遭受重放攻击。如果不需要,仍然无法抑制因新账户的创建而产生的状态爆炸问题。定价:链上存储资源的稀缺程度,与区块链的生态价值及当下的市场需求密切相关。如何建立一个合理定价模型便是个非常重要的问题。Ethereum Research中有大神对状态租金的方案进行了细化,引入了激励机制用于租赁过期的发现和确认,并且允许在状态
数据
删除后申请恢复。Nervos CKB结合了状态买卖和状态租金的长处,利用原生代币代
表
占用全局状态的权利,且汇率恒定,即1 CKB代
表
1 Bytes的存储空间。同时巧妙地利用【二级发行】机制为代币持有者(存储空间占有者)设置了【通胀税】,以作为支付给矿工的状态租金。靠通胀收取租金的方式既保留了RAM方案的买断存储空间的使用模式,
解决
了上面所提到的用户体验的问题,又将定价转移到了通胀部分对应的法币价值,完全由二级市场进行价值发现。但这使得状态空间的上限严格等同于当前代币流通量,在初期可能会限制生态的发展。合约安全我们在第一篇中有提到,合约安全分为编译期安全和执行期安全。本篇主要阐述执行期安全的设计思路。执行期安全也成为运行期安全,主要由VM针对以下两方面提供保障:
数据
安全:不能随意篡改其他用户或其他合约的状态
数据
。资源安全:CPU、内存、硬盘资源的分配与回收。
数据
安全加密数字资产真正实现了人类梦寐以求的“私有财产神圣不可侵犯”,它象征着真正的自由。为了捍卫这份“自由”,
数据
安全是重中之重。VM需要为以下两个方面提供安全保障:用户
数据
的安全,即利用密码学算法判断是否有修改状态
数据
的权限。合约状态
数据
的隔离,即任何合约都不能直接修改其他合约的状态
数据
,即使该用户拥有权限。第一个维度很好理解,合约会提供根据用户地址和交易签名进行身份权限审查的功能(甚至可提供基于多密钥对的权限管理),以判断本次合约调用是否有权限修改相应的
数据
。这也是“私有财产神圣不可侵犯”的根源。第二个维度需要特别解释一下。这里的不能直接修改其他合约的状态
数据
,是指不能在合约A的方法中直接修改合约B的
数据
。为什么?因为这会导致状态变更无法追溯,带来不确定性。我们知道,区块链环境中只能通过交易(Transaction)来触发状态变更,交易本身就是状态变更的日志。若允许在合约A中直接修改合约B的状态
数据
,则这次修改是并未生成相关日志的,使得状态修改无法追溯,与区块链“可追溯”的特性相违背。以太坊中跨合约调用也是没有保留日志的。笔者认为这是因为以太坊合约是不可升级的,一旦部署后地址和代码都是不可变更的,因此可结合交易和代码具体片段来追踪状态变更记录。但以太坊并没有提供相关的索引,这导致对状态修改的记录追踪基本不可能,因此我认为这是一个设计上的重大缺陷。在EOS中,我们看到跨合约调用是生成了新的action,并被加入到原action列
表
中,在链上保留了状态修改的日志。能否利用静态代码分析的方式确定跨合约的对方地址和相关合约方法,从而追溯到状态变更的细节?当然是可行的,但如果有多层调用(合约A -> 合约B -> ... -> 合约Z),这种方案显然开销是非常大的。尽管以太坊提供了tracer,可以在执行交易的过程中追踪跨合约调用的对象,但如果我想查找导致合约X某状态变更的所有历史操作,上述方案必须遍历并模拟执行所有的历史交易,显然是不可取的。我们认为,跨合约交易正确的做法,是通过内联交易的形式调用合约B的方法从而间接修改合约B
数据
。即生成一个新的交易来触发目标合约的状态变更。该交易也会应放入区块中,视为由原交易生成的日志。这样可为状态变更保留操作记录,也符合“可追溯”的特征。资源安全智能合约通常运行在由虚拟机提供的沙箱环境,我们需要对其能够使用的资源进行适度的把控。这些资源包括三类:CPU、内存、硬盘。下面我们以QA的形式对涉及到的问题进行解答——CPU资源Q1: 合约运行最大能占用多少个进程,多少个线程?一个;一个或多个。Q2: 是否允许合约内开辟新线程?不允许。合约不应有操作系统级别的调用,而应由虚拟机层来确定性地分配CPU资源(线程数)。Q3:多线程下如何保证线程安全?多线程下,不应通过加锁来保证线程安全,原因是加锁无法保证执行顺序,带来不确定性。正确的做法是在执行前通过静态分析、注解等手段对合约调用进行归类。互斥资源的调用顺序遵循交易发送的顺序;非互斥资源的合约调用可以并行执行。Q4: 如何控制执行时间?利用Gas机制控制合约执行时间(在本系列第一篇已提到),避免过度占用CPU时间。Q5: 如何捕捉错误与处理?合约执行的错误不应导致虚拟机的进程终止,虚拟机应当提供错误捕获和处理的机制。常规的做法时合约运行时的错误以error的形式抛出,虚拟机层捕获后做失败处理,包括终止交易执行、状态回滚、资源回收等。内存资源Q1:合约运行最大能占用多少内存?节点能分配多大的内存给虚拟机,是由矿工决定。这本质上经济学问题:扩大内存分配无疑会增加成本,而这部分提升的执行效率能为矿工带来多少收益。若可用内存过少,部分交易执行失败,可能导致分叉;若可用内存过多,又会造成资源浪费,降低矿工收益。Q2: 内存能否动态扩张?可以,但须要付费。为了防止内存无限制扩张,虚拟机还应对合约的内存占用设置上限。Q3: 如何避免内存泄漏?不应交由合约开发者控制内存回收,虚拟机应当实现GC机制。Q4: 如何避免内存溢出?Wasm虚拟机中内存实则为字节数组,本身带有边界控制,能有效防止内存溢出。磁盘资源Q1: 单个合约最多能够存储多少
数据
?这也是经济学问题,应该设置合理的硬盘占用计费。Q2: 能否修改其他合约的持久化
数据
?不能直接修改,因为这会影响到【
数据
安全】章节中提到的确定性。虚拟机为合约创建的上下文环境中,包含相互隔离的
数据
空间。可以通过创建新的上下文环境进行
数据
修改,这样的操作视为一次新的合约调用(保留日志)。Q3: 如何防止未知的
数据
丢失(如磁盘损毁)?当发生
数据
丢失时,节点执行合约会得到不同的状态结果,导致区块被认定为非法,区块链无法延长。这里需要区块链系统具备状态一致性的检测机制,在
解决
硬盘故障后采用同步主链块并重放交易的方式进行恢复。系统合约系统合约是指区块链系统在启动时预先部署的,可升级、可治理的合约,提供如权限控制、资源租赁、代币质押等基础服务。系统合约通常有以下三个特点:公开透明,无暗箱操作。可通过Env_api被用户合约调用。合约通过治理进行代码变更,无须硬分叉。系统合约可采用普通合约的实现方式,并在系统预定的合约地址部署。未来优化方向智能合约的并行执行合约并行执行是提升智能合约执行效率的一大思路。这里的并行执行并不是指单个合约方法内部的并行,而是合约间的并行。实现合约并行执行,我们需要考虑两个重要的问题:如何检测本次合约执行所访问的资源对象?如读写状态
数据
、读取账户余额等互斥操作。如何做合约执行的合理调度?即哪些合约能够并行执行,哪些必须串行?一种容易想到的思路是这样的:通过静态代码分析检测出合约方法可能访问到的资源,对会访问相同资源的合约调用归为同一个组。每个组的执行可以并行化,组内执行则串行化(根据交易发送顺序)。然而,实际设计时需要考虑的因素就复杂很多:如何设计一个完备的算法,准确地检测合约方法可能访问到的资源(包括跨合约调用中的资源访问)?如何设计一个高效的调度算法,将合约调用准确分组?合约并行执行后所带来的性能提升,是否能够追回以上两个算法所带来的开销?预言机预言机是智能合约获取链外
数据
的桥梁。这些
数据
通常由第三方可信
数据
源提供,如天气
数据
、赛事
数据
、数字货币价格等。在传统的互联网应用中,我们可以简单地通过HTTP API获取到这些
数据
。但在智能合约却不行,原因是HTTP调用通常是异步的,时间不可预估且不具备确定性。因此,需要一个专门的基础设施来为智能合约提供这些链外
数据
。预言机的设计原则中需要考虑三个要点:获取链外
数据
并保证
数据
的真实可用。以确定性、同步的方式被智能合约调用获取。预言机网络本身的安全性和可用性。隐私保护密码学的研究推动了隐私领域的创新。隐私研究主要涉及零知识、多方计算、全同态加密等领域。多方计算 MPC 允许一组人基于他们的输入进行联合计算,而不需要每个人显示其输入值。 例如,Alice 和 Bob 想要知道谁拥有的比特币更多,那么在不需要他们披露自己拥有多少比特币的情况下就能达到这个目的。遗憾的是,目前多方计算的局限性在于它在实践中使用效率极低。全同态加密 (Fully homomorphic encryption) 则允许人们在加密的
数据
上计算。几十年来,这一直是密码学领域中的一个未
解决
的问题,直到 2009 年,斯坦福大学博士生克雷格·詹特利 Craig Gentry 使用「理想格」构建了第一个全同态加密方案。如果 Bob 想在 Alice 的
数据
上执行任意计算,比如训练机器学习模型,同时不必要求 Alice 显示明文
数据
,理想格加密方案就能派上用场。全同态加密和多方计算一样,目前仍然基本上停留在理论阶段,在实践中的使用效率太低。
Enterprise Architect
141
社区成员
15
社区内容
发帖
与我相关
我的任务
Enterprise Architect
Enterprise Architect 是用于软件系统的设计与开发、企业业务过程建模以及更广泛建模的可视化平台,是一个完全的UML分析和设计工具。
复制链接
扫一扫
分享
社区描述
Enterprise Architect 是用于软件系统的设计与开发、企业业务过程建模以及更广泛建模的可视化平台,是一个完全的UML分析和设计工具。
软件构建
uml
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章