使用回调 由于Web3.js API被设计用来与本地的RPC结点交互,所以所有函数默认使用同步的HTTP请求。...如果想发起一个异步的请求,那么大多数函数允许传一个跟在参数列表后的可选的回调函数来支持异步。回调函数支持错误优先的回调模式(Error First Callback)。例如: ?...点击Create,就会将智能合约部署到我们的测试环境中,如下图所示。 ? 智能合约部署之后,接下来要编写应用UI及跟合约交互的部分。...contracts为智能合约的文件夹,所有的智能合约文件都放置在这里。 migrations是用来处理部署(迁移)智能合约的。迁移是用一个额外、特别的合约来保存的。 test智能合约测试用例文件夹。...创建用户接口和智能合约交互 我们已经编写、部署及测试了智能合约。现在我们为合约编写UI,让UI和合约能真正交互起来。
传统的回调式异步操作有什么缺点 (Promise如何解决异步信任问题的) 传统的回调有五大信任问题: 调用回调太早 调用回调过晚(或没有被调用) 调用回调次数过少或过多 未能传递所需的环境和参数 吞掉可能出现的错误和异常...2.调用回调过晚(或没有被调用) 对于一个Promise对象注册的每一个观察回调都是相对独立、互不干预的。...而Promise对象调用resolve()和reject()时,每个注册的观察回调也都会被自动调度。所以这些观察回调的任意一个都无法影响或延误对其他回调的调用。 此外,关于回调未调用。...5.吞掉可能出现的错误和异常 如果在创建Promise时,存在JavaScript代码错误,会直接导致该Promise的拒绝决议,那么你可以通过reject()来捕获异常,代码中的任何异常都不会吞掉。...而对于Promise对象来说,构造Promise实例时的代码如果出错,则会被认为是一个拒绝的决议,并会向观察回调中传递异常信息。所以即使是一个异步的请求,Promise也是可以捕获异常的。
# Promise 信任问题 把一个回调传入工具 foo() 时可能出现如下问题: 调用回调过早; 调用回调过晚(或不被调用); 调用回调次数过少或过多; 未能传递所需的环境和参数; 吞掉可能出现的错误和异常...任何 Promise 链的最后一步,不管是什么,总是存在着在未被查看的 Promise 中出现未捕获错误的可能性,尽管这种可能性越来越低。...但它们辨识未捕获错误的方法是定义一个某个时长的定时器,比如 3 秒钟,在拒绝的时刻启动。...它的处理方式类似于你可能对未捕获错误通常期望的处理方式:done() 拒绝处理函数内部的任何异常都会被作为一个全局未处理错误抛出(基本上是在开发者终端上)。...如果在它被垃圾回收的时候其中有拒绝,浏览器就能够确保这是一个真正的未捕获错误,进而可以确定应该将其报告到开发者终端。
最近利用智能合约代码中的错误进行的攻击造成了严重后果,修复错误并及时部署补丁合约具有很大的挑战性。即时修补尤为重要,因为由于区块链系统的分布式特性,智能合约始终在线,它们还管理着相当数量的资产。...先前已经在自动利用漏洞产生的背景下研究了这种访问控制漏洞的自动检测,此外整数溢出错误构成了智能合约中的主要漏洞类别。...结果,修补智能合约错误目前是一个耗时,麻烦且容易出错的过程。例如,在修补Parity multisig wallet合约的同时,引入了一个漏洞。攻击者得以成为新部署的库合约的所有者。...方法:在整个研究过程中,要求开发人员手动执行由EVMPATCH自动执行的多个任务:(1)在给定静态分析器(OSIRIS)输出的情况下,手动修补由于整数溢出错误而易受攻击的三个合约,(2)使用EVMPATCH...尽管许多建议引入了可帮助开发人员查找错误的框架,但对于开发人员和社区如何快速,自动地对已部署合约中的漏洞作出反应,这仍然是开放的。
鉴于快速发展的以太坊基础设施(新平台、新语言、新工具和新协议)的复杂程度令人瞠目结舌,以及部署管理数百万美元的智能合约所带来的风险,我认为智能合约开发者/审核员的工作有点类似于上文提到的外科医生/飞行员...未锁定版本。合约应使用与其测试过的编译器版本/标志去部署。...锁定 pragma(例如在pragma solidity 0.5.10中不使用 ^ ) 可以确保合约不会意外地被部署到一个有未修正错误的旧编译器版本。...虽然*transfer()和send()被推荐为防止重入攻击的最佳安全做法,因为它们只使用 2300 Gas ,但操作码的 Gas 重新定价可能会破坏已部署的合约。...死代码可能表明程序员出错、逻辑缺失或潜在的优化机会,需要标记出来予以删除或适当处理。(见此处[103]) 未使用的返回值。函数调用中未使用的返回值表明程序员错误,可能会产生意外行为。
漏洞分析 以太坊智能合约的特点之一是能够调用其他外部合约的代码,然而这些外部合约可能被攻击者劫持,迫使合约通过回退函数进一步执行代码,包括回调本身。...但是有个问题是他没有先对用户的代币余额进行清零,而智能合约进行转账的时候会调用收款方 fallback 函数 合约可以有一个未命名的函数 —— Fallback 函数。...receiveEther.value(1 ether)(); } function reentry(address addr){ Victim(addr).withDraw(); } } 部署...Attacker 合约,给 Attacker 合约 1 以太币 部署之后点击 showAccount 再点击 amount 看一下余额,成功 同样,部署 victim 合约,给他 10 以太币,目前账户余额如下...Attacker 合约中,同时 test 的值为 11,说明 fallback 函数被调用了 11 次 漏洞防范 重入漏洞的关键在于:利用回退函数调用函数本身,形成递归调用,在递归调用的过程中进行了转账操作
} window.onerror 优点: 可以捕获同步和异步的异常 可以获取到错误的详细信息 缺点: 受到同源策略的限制,只能捕获当前域名下的错误 无法捕获语法错误和网络异常的错误 无法阻止异常继续传播...因为无法保证我们编写的代码是否会出错,如果将其放置在后面,一旦发生错误,onerror 将无法捕获到异常。 window.onerror 只能同时订阅一个错误处理函数。...); Promise.then().catch(cb) 优点: 可以捕获 Promise 的拒绝(失败)状态,并执行相应的错误处理逻辑 可以很方便地处理 Promise 的成功和失败回调 缺点: 无法捕获...可以捕捉请求过程中的各个阶段的错误,如请求失败、超时等 缺点: 需要编写更多的代码来处理请求细节,容易出现回调地狱。 需要手动处理跨域问题 不支持 Promise,需要使用回调函数来处理响应结果。...Vue提供的错误处理回调——Vue.errorHandler(针对与vue框架,无法捕获异步异常) 微信小程序提供的错误处理——onError(异步、同步都可以捕获)。
如下,图1是驱动调用WdfDmaTransactionExecute函数的次数与操作系统调用回调函数的次数不一致的截图。 ?...图1 DebugMonito监测 其中,5658(5576+82+0)为驱动调用WdfDmaTransactionExecute函数的次数,5664为操作系统调用回调函数的次数。...我们尝试将操作系统多出来的调用回调函数的次数跳过,即仅保留第一次调用。硬件侧可以正常完成这次DMA传输,并触发DMA写完成中断。...至此,我们猜测,操作系统多次调用回调函数的原因是其认为配置过程出错才重新进行配置,直至最后一次成功。...在这个过程中,用于临时拷贝中断寄存的变量Adapter->IsrCode_dpc被覆盖重写。覆盖的直接后果是,前者已读取到的寄存的中断,后者覆盖后就无法由中断延迟处理程序进行处理。
双引号 命令执行漏洞简介: 原因: 未对用户输入进行检查过滤,导致用户输入的参数被应用当成命令来执行。...> eval() 函数传入的参数必须为PHP代码,即要以分号结尾; 弊端:eval函数可以执行任意php代码 2.assert 断言函数,用于在调试过程中捕捉程序的错误。...“断言”在语文中的意思是“断定”、“十分肯定地说”,在编程中是指对某种假设条件进行检测,如果条件成立就不进行任何操作,如果条件不成立就捕捉到这种错误,并打印出错误信息,终止程序执行。...array_map ( callable callback , array array1 [, array ) 将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组 数组的每个元素应用回调函数... array_filter() 函数用回调函数过滤数组中的值。
除此之外,合约的公开性、回调机制,每一个特点都可被利用,作为攻击手法,稍有不慎,轻则合约形同虚设,重则要面临企业机密泄露的风险。...安全性(Security) 智能合约编写,首要考虑的就是安全性问题。 在区块链世界中,恶意代码数不胜数。...如果此时又递归地调用了some,修饰符的逻辑会再次激活,由于此时的locked属性已为true,修饰符的第一行代码会抛出错误。 ?...,无法获取链外数据,影响了智能合约的应用范围。...链外数据可极大扩展智能合约的使用范围,比如在保险业中,如果智能合约可读取到现实发生的意外事件,就可自动执行理赔。 获取外部数据会通过名为Oracle的链外数据层来执行。
“数据可靠性”、“gas消耗优化”、“合约用户”、“日志记录”、“回调函数”、“Owner权限”、“用户鉴权”、 “条件竞争”等,统一归类为“以太坊智能合约编码隐患”。...详见下文: 二、漏洞详情 以太坊智能合约是以太坊概念中非常重要的一个概念,以太坊实现了基于solidity语言的以太坊虚拟机(Ethereum Virtual Machine),它允许用户在链上部署智能合约代码...对于智能合约来说,任何函数的执行都是通过交易来完成的,但函数的执行过程中可能会遇到各种各样的问题,在交易失败或者交易结束后,就会执行fallback来最后处理结果和返回。...关于owner权限问题,应该遵循几个要求: 合约创造后,任何人不能改变合约规则,包括规则参数大小等 只允许owner在合约销毁前,从合约中提取余额 owner不能在未限制的情况下操作其他用户的余额等...五、一些思考 在这一次整理合约编码隐患的过程中,对智能合约本身的特殊性进行了深入了解。
主要存在的问题包括: 一、存在整型溢出错误; 二、权限检查不严谨; 三、API函数的不规范使用; 四、常规代码错误。...EOS合约存在不严谨之处 我们通过对已审核的EOS合约分析,发现存在如下主要问题: 1、存在整型溢出错误 使用自己的数据结构描述代币,对代币数值进行算数运算时未进行安全检查。...在误操作时容易产生整型溢出错误,可能导致代币量归零甚至变成负数的严重结果! 2、权限检查不严谨 权限检查不严谨,造成逻辑漏洞。...如 string_to_symbol(uint8_t , const char *),第一个参数传入的整型变量需要小于256,若使用该API前未对输入进行检查,则可能导致整型溢出,从而导致操作了错误类型的代币...另一方面,智能合约安全作为一个关键的链上交易程序,一旦部署将无法撤销。
原生Promise的捕获错误 原生Promise在遇到错误有两种可能 executor函数里面的代码有错误,但是没有被then的reject捕获,会修改Promise的状态为rejected,并抛出错误...返回,不会抛出错误; 如果没有then捕获错误,就不会reject,然后抛出错误; 如果有catch捕获错误,就会把错误信息通过reject返回,不会抛出错误; 即只要错误有被Promise捕获到...,就会通过reject返回 没有Promise.then回调 // executor函数里面的代码有错误,但是没有被then的reject捕获,会修改Promise的状态为rejected,并抛出错误...且有reject回调 // executor函数里面的代码有错误,但是有被then的reject捕获,不会抛出错误,会修改Promise的状态为rejected,然后通过reject回调返回错误原因 var...再判断抛不抛出错误 // 步骤: // 1,捕获到错误,存到exception; // 2,遇到定时器宏任务,把定时器的回调放进宏任务队列,等待函数执行栈全部执行完再执行
want && want(); } fn(want); 利用回调函数封装,是我们在初学 JavaScript 时常常会使用的技能。...另外,then()方法指定的回调函数,如果运行中抛出错误,也会被catch()方法捕获。...不过,Node.js 有一个unhandledRejection事件,专门监听未捕获的reject错误,上面的脚本会触发这个事件的监听函数,可以在监听函数里面抛出错误。...如果 Promise 内部有未捕获的错误,会直接终止进程,并且进程的退出码不为 0。 再看下面的例子。...到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。
DOS Network 是一个 Layer-2 的预言机解决方案,它通过在链上部署一个轻量级智能合约,链下是一个 p2p 网络,服务节点的选取和数据验证采用 VRF+阈值签名等技术,保证了去中心化和数据安全...外部数据源服务会在智能合约平台部署一个外部数据源服务合约,用户合约通过调用该服务合约发送外部数据源请求,链下的 TEE 外部数据源服务对接该服务合约,监听用户的请求,然后去对应的外部数据源取数据,最后将结果返回给用户合约...回调接口 oracleCallbackCurlResponse 回调接口需要业务合约实现,用于接收预言机合约的请求结果回调,如果未能正确实现该合约,则将无法接收请求结果。...合约错误码表。...nonce_str、timestamp、time_to_live 暂未启用。
,这时就可以使用回调函数让它像异步编程语言一样工作。 ...; // catch 不仅可以捕获失败和 return Promise,也可以捕获异常。...它的 reject 回调执行是只要任何一个输入的 Promise 的 reject 回调执行或者输入不合法的 Promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。...Promise 实例,再继续使用 then 通过 res 参数可以获取上一次 return 的数据,并在该 then 方法中发送后续的异步请求,这样就达到了我们之前说过的链式调用传递效果,而且 reject 抛出错误的时候...,只需在最后 catch 一层就可以了,这样无论是哪个 then reject 了,都会在最后的 catch 这里捕获到错误。
添加此字段表示打开行政区域解析功能 └- autoCom String 否 1 添加此字段且将此值设为1,则表示开始智能判断单号所属公司的功能...(如不支持的快递公司、单号为空、单号超长等)或错误的回调地址 请检查快递公司编码、对照技术文档检查参数、在后台调试工具测试回调地址 702 POLL:识别不到该单号对应的快递公司...comNew都为空;(2)如果贵司提交的快递公司编码出错,我们会帮忙用正确的快递公司编码+原来的运单号重新提交订阅并开启监控(后续如果监控到单号有更新就给贵司的回调接口(callbackurl)推送带有如下字段的信息...如果提交回调接口的地址失败,30分钟后重新回调,3次仍旧失败的,自动放弃 returnCode 200: 提交成功 500: 服务器错误 其他错误请自行定义 message...信息推送服务是企业提交快递单号,快递100接收到后便对这些运单进行跟踪,当运单状态发生变化的时候,快递100便通过调用回调接口将运单的跟踪信息推送给贵公司,直到这些运单号的生命周期结束(一般以“已签收”
部署智能合约的输出结果 查看testrpc的输出窗口,可以看到这笔交易和花费的区块: ?...如果已启动的则忽略此步。 $ testrpc 3.7 部署合约(migrate) 执行部署命令(truffle migrate)提示出错。...truffle migrate 错误截图输出: ? 部署失败,提示网络未配置 修改文件....hello,world智能合约运行成功 3.8 GETH正式环境运行合约 启动GETH环境 本节假设GETH环境已安装好了。...智能合约部署成功 获得Greeter的地址为 0xb52bb3ce336f71a14345c78e5b2f8e63685e3f92 切换到GETH环境下,利用api和智能合约地址(你自己Greeter智能合约的地址哦
(2)客户端(定义其使用C++代码实现)调用Chrome V8引擎,并把合约代码加载到引擎里执行,在执行的过程中如果遇到内置的接口,就会产生回调函数,调用客户端代码,此时实现了双向交互功能。...(3)合约在执行过程中,有可能产生新的交易,如合约账户B在合约内部通过接口对账户C进行转账操作,如果账户C仅是普通账户,那么只需进行普通转账操作即可;如果账户C是一个合约账户,那么将会再次触发新的合约形成一次递归调用...合约调用合约的递归深度为3层,超过3层将会出错并回退整个交易,这是出于合约实现的复杂度和区块链底层的安全性来考虑与设计的。...智能合约安全开发指南 开发智能合约和开发普通程序有一定的区别,其部署之后无法被修改,甚至很难升级,且数据无法被篡改,因此,开发智能合约需要遵循以下几个原则: (1)保持合约的简洁。...(4)对于不可预知的错误,要多使用断言并终止程序。 (5)避免重入攻击。
领取专属 10元无门槛券
手把手带您无忧上云