二维码

13.8 开发最佳实践小结 - 数据结构 - 机器学习

1265 人阅读 | 时间:2021年01月15日 01:17
13.8 开发最佳实践小结 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

13.8 开发最佳实践小结

1081 人参与  2018年09月29日 11:02  分类 : 区块链精品文章  评论

链码作为一种新型的应用逻辑,由于天然运行在分布式系统中,被封装在容器内,跟现有的应用场景往往存在较大差异。在开发链码过程中,也需要始终注意其独特的运行特点,设计合理的代码逻辑。

1.重视资源限制

由于链码运行在容器内,这意味着单个链码所能占用的资源会受到容器资源的限制。考虑到现有的容器系统,默认的资源限制往往不大,因此在链码代码中不建议编写资源消耗型的应用。

例如如果代码中出现大量消耗内存且不释放的逻辑,容易造成内存泄露,最后导致整个容器响应缓慢或者崩溃,这都将给上层应用带来较多的挑战。

另外,容器内往往不提供稳定的文件系统或网络的支持,甚至整个容器都可能出现被杀死后重新启动新容器的情况,因此代码中不应该假设有稳定的外部文件系统和网络接口可供访问。

2.无状态设计

链码在设计上是典型的无状态(Stateless)设计,链码逻辑中所有处理的状态都存在于账本上,而不是链码结构自身。因此,链码的方法最好都设计为类似“函数式”风格,不能依赖通过临时变量等方式记录之前的运行结果。

无状态设计在之前被广泛应用到了Web服务等诸多领域。从这个角度看,应用和链码层类似Web中的服务应用,而账本层则类似于Web后端的数据存储。

某些特定场景下,用户可能需要支持有状态的需求,例如对出错进行重试处理等。这种情况下,有状态的逻辑代码需要放在应用侧进行实现。

目前,Fabric SDK在设计上从使用方便的角度采用了带有状态的实现,未来从安全角度考虑也将支持无状态的设计和实现。

3.避免非确定性逻辑

当链码部署运行后,区块链网络中的多个节点上都会启动链码容器并执行其内部指定的逻辑。当多个相同链码的实例对同一调用 得到彼此不相同的结果时,无法收集足够的背书,网络中也将无法完成共识。此时,与此链码相关联的交易实际上将无法完成。因此,合格的链码必须保证内部不能 出现非确定性的逻辑。

但当某些情况下,可能业务需求必须采用一些非确定性设计,比如类似抽奖之类的操作,需要采用随机数生成;再比如查询外部数据源(如天气预报或股票)的值,可能出现不同节点由于查询时间或所处位置的不同导致结果不同。

对于这样的情况,一种方法是避免将这部分非确定性的代码在链码中实现,而是放在外部通过代理服务来完成。所有的节点需要 使用数据时向该代理进行查询即可,避免出现不一致。另外一种思路是将这些非确定的查询改为确定性查询,例如在调用时通过传入足够多的参数或进行平滑处理 (如指定查询范围或者取最值),让返回的结果在一定范围下是确定的,也可以避免问题。

4.链码结构设计

上层应用和链码代码在某种程度上共同完成了业务逻辑。不同的是,链码封装了对区块链账本的操作,上层应用通过直接调用链码接口来使用,而不会意识到底层区块链结构的存在。

因此,某些情况下,部分功能或逻辑既可以贴近链码侧,又可以贴近上层应用侧。实际上,从应用架构的角度,上层应用的逻辑和链码逻辑是完全有机的结合,并不存在明显的界限。

实践中,有人会愿意把大部分逻辑都放进链码侧实现,只保留简单、少量的应用接口。这样对上层应用的要求很轻,可以更好地 支持现有业务系统,但当业务逻辑发生变化时,需要对链码进行升级;也有人倾向只将跟账本打交道的核心逻辑封装到链码里,链码实际上是一个轻量级的接入层。 这意味着上层应用要实现更多的业务逻辑,同时底层链码可以尽可能的保持稳定。

两种模式从设计上各有利弊。一般而言,跟信任相关的逻辑因为要通过区块链系统的共识和验证,必须要放到链码中实现。容易 发生变动的业务逻辑代码则更应该放到应用侧实现。目前,以Fabric为代表的区块链账本平台对链码的支持越来越完善,所能支持的逻辑代码功能可以越来越 复杂。

5.链码的生命周期管理

链码代码作为跟应用密切相关的逻辑代码,是企业十分核心的数字资产。从开发者编写链码、调试链码到部署到区块链中进行调用,整个生命周期都必须被严格把控。

链码代码跟其他应用代码一样,一旦丢失将无法从运行实例中恢复,因此应该采用可靠的代码管理机制进行保存。在测试环节推荐采用单独的区块链网络,测试通过上到生产链后也需要先在部分节点上进行安装验证,通过之后再进行大规模部署。

由于无状态的设计,链码容器在发生故障后可以被安全卸载,只要保留了链码代码的前提下,都可以重新进行生成。链码容器生成所依赖的基础镜像必须安全可靠,内容尽量简单,不要包含逻辑代码,通过安全仓库或者提前分发形式部署到运行节点中。

链码部署进入运行状态后,理论上任何具备合适权限的用户都可以对其进行调用。因此,链码名称、版本号和调用接口最好进行 私密保护,采用相对难猜的命名,并且不能泄露给无关实体。为了避免通道内其他组织在获知链码信息后在其他通道进行实例化,还需要通过指定实例化的策略来进 行限制(FAB-3156)。另外,调用过程推荐进行必要的监控处理,可以通过以下方法把控:事件方式进行监听,对事件进行实时审计,对异常情况制定响应 流程。

本章小结

本章介绍了区块链应用开发的知识,以Fabric链码为例讲解了智能合约的概念和工作原理,并结合实际开发案例讲解了链码应用的开发过程,最后还总结了实践中的注意事项。

如果说区块链账本平台提供了计算机硬件,那么链码相当于计算机指令集,在整个区块链技术栈中处于十分核心的位置。

分布式账本结合智能合约所构建出的新型应用逻辑,相较于传统应用,更加重视可信任性、安全性和效率的提升。通过本章的学习,相信读者能够在实践中体会这一新型应用逻辑的独特之处,掌握区块链应用的开发技巧。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=890

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×