智能合约 订阅
智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。 展开全文
智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。
信息
外文名
Smart contract
提出者
尼克·萨博(Nick Szabo)
中文名
智能合约
出现时间
1995年
智能合约术语简介
“智能合约”(Smart contract)这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表于自己的网站的几篇文章中提到了智能合约的理念,定义如下:“一个智能合约是一套以数字形式定义的承诺(commitment),包括合约参与方可以在上面执行这些承诺的协议。” [1] 
收起全文
精华内容
下载资源
问答
  • 智能合约

    2018-07-16 15:30:23
    由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境,以太坊首先看到了区块链和智能合约的契合,发布了白皮书...

    智能合约是 1990s 年代由尼克萨博提出的理念,几乎与互联网同龄。由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境,以太坊首先看到了区块链和智能合约的契合,发布了白皮书《以太坊:下一代智能合约和去中心化应用平台》,并一直致力于将以太坊打造成最佳智能合约平台,所以比特币引领区块链,以太坊复活智能合约。

    怎样向尚未接触过比特币理念的人介绍以太坊及智能合约在金融合约方面的应用?下面是一种尝试。首先介绍区块链,解释它为什么值得人们的信任,其次介绍智能合约,然后介绍以太坊系统,最后介绍智能合约与金融合约的结合。

    比特币的共识机制

    比特币的核心技术区块链可以理解成可复制、共享的账本。

    比特币的最核心创新:它教会世界如何在不需要信任第三方的情况下远距离转移价值。

    人们当然可以面对面地转移实体纸币,但是,在比特币出现以前,我们做不到:在不需要信任中心化第三方机构(邮局、银行等)的情况,远距离向某人转移价值。

    就好像银行和支付系统的传统转账模式的基础设施被重构为点对点支付网络。这种转变如下图所示:

    比特币的共识机制

    比特币的核心技术区块链可以理解成可复制、共享的账本。

    比特币的最核心创新:它教会世界如何在不需要信任第三方的情况下远距离转移价值。

    人们当然可以面对面地转移实体纸币,但是,在比特币出现以前,我们做不到:在不需要信任中心化第三方机构(邮局、银行等)的情况,远距离向某人转移价值。

    就好像银行和支付系统的传统转账模式的基础设施被重构为点对点支付网络。这种转变如下图所示:


    比特币打开了点对点的电子价值转移模式的大门,完全不同于现在的银行系统、中央银行和支付系统。 但是,上面的图并没有解释比特币是怎样实现点对点价值转移的。

    答案是:比特币系统建立在“可复制、共享的账本”之上。比特币网络中的每个参与者(完全节点)拥有一个完整的交易账本的副本,这一系统的神奇之处在于:它是如何做到使每个人的副本与其他人的副本保持一致的。

    所以,正确的示意图应该是下图,每个参与者都能够从相同的可复制、共享的账本中获取信息。


    比特币和其它去中心化共识系统的窍门在于:它们怎样保证每个有一个账本的副本,并使每个人确信自己的账本与别人的账本是同步的。

    如果每个人拥有的账本的副本是相同的,那么人们就不再需要一个中心化的机构记录谁拥有什么。当你的账本更新,记录一笔新的资产所有权变动时,其他人的账本也会发生相同的变动。

    智能合约

    智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。

    这个程序就像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。

    下面这个示意图就是一个智能合约模型:一段代码(智能合约),被部署在分享的、复制的账本上,它可以维持自己的状态,控制自己的资产和对接收到的外界信息或者资产进行回应。


    智能合约模型:它是运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。

    以太坊系统

    以太坊项目借鉴了比特币区块链的技术,对它的应用范围进行了扩展。如果说比特币是利用区块链技术的专用计算器,那么以太坊就是利用区块链技术的通用计算机。简单地讲,以太坊 = 区块链 + 智能合约。

    与比特币相比,以太坊最大的不同点是:它可以支持更加强大的脚本语言(用技术语言讲就是图灵完备的脚本语言),允许开发者在上面开发任意应用,实现任意智能合约,这也是以太坊的最强大之处。作为平台,以太坊可以类比于苹果的应用商店,任何开发者都可以在上面开发应用,并出售给用户。

    以太坊智能合约的金融应用

    每一类金融合约都可以程序代码的形式写成智能合约。

    差价合约

    金融衍生品是“智能合约”的最普遍的应用,也是最易于用代码实现的之一。实现金融合约的主要挑战是它们中的大部分需要参照一个外部的价格发布器;例如,一个需求非常大的应用是一个用来对冲以太币(或其它密码学货币)相对美元价格波动的智能合约,但该合约需要知道以太币相对美元的价格。最简单的方法是 通过由某特定机构(例如纳斯达克)维护的“数据提供“合约进行,该合约的设计使得该机构能够根据需要更新合约,并提供一个接口使得其它合约能够通过发送一 个消息给该合约以获取包含价格信息的回复。

    当这些关键要素都齐备,对冲合约看起来会是下面的样子:

    等待A输入1000以太币。

    等待B 输入1000以太币。

    通过查询数据提供合约,将1000以太币的美元价值,例如,x美元,记录至存储器。

    30天后,允许A或B“重新激活“合约以发送价值x美元的以太币(重新查询数据提供合约,以获取新价格并计算)给A并将剩余的以太币发送给B。

    代币系统(token system)

    区块链上代币系统有很多应用,从代表如美元或黄金等资产的子货币到公司股票,单独的代币代表智能资产,安全的不可伪造的优惠券,甚至与传统价值完全没有联系的用来进行积分奖励的代币系统。在以太坊中实施代币系统容易得让人吃惊。关键的一点是理解,所有的货币或者代币系统,从根本上来说是一个带有如下操作的数据库:从A中减去X单位并把X单位加到B上,前提条件是(1)A在交易之前有至少X单位以及(2)交易被A批准。实施一个代币系统就是把这样一个逻辑实施到一个合约中去。

    储蓄钱包

    假设Alice想确保她的资金安全,但她担心丢失或者被黑客盗走私钥。她把以太币放到和Bob签订的一个合约里,如下所示,这合同是一个银行:

    Alice单独每天最多可提取1%的资金。

    Bob单独每天最多可提取1%的资金,但Alice可以用她的私钥创建一个交易取消Bob的提现权限。

    Alice 和 Bob 一起可以任意提取资金。

    一般来讲,每天1%对Alice足够了,如果Alice想提现更多她可以联系Bob寻求帮助。如果Alice的私钥被盗,她可以立即找到Bob把她 的资金转移到一个新合同里。如果她弄丢了她的私钥,Bob可以慢慢地把钱提出。如果Bob表现出了恶意,她可以关掉他的提现权限。

    作物保险

    一个人可以很容易地以天气情况而不是任何价格指数作为数据输入来创建一个金融衍生品合约。如果一个爱荷华的农民购买了一个基于爱荷华的降雨情况进行反向赔付的金融衍生品,那么如果遇到干旱,该农民将自动地收到赔付资金而如果有足量的降雨他会很开心因为他的作物收成会很好。

    多重签名智能合约

    比特币允许基于多重签名的交易合约,例如,5把私钥里集齐3把就可以使用资金。以太坊可以做得更细化,例如,5把私钥里集齐4把可以花全部资金,如果只3把则每天最多花10%的资金,只有2把就只能每天花0.5%的资金。

    展开全文
  • 可升级的以太坊智能合约设计模式 目录 可升级的以太坊智能合约设计模式 智能合约的现状 智能合约的局限 智能合约目前的发展方向 如何利用智能合约实现复杂的业务场景 智能合约设计模式的技术点 智能合约设计模式 ...
  • 个人使用的是以太坊平台,solidity编写的智能合约,solidity版本...如果将核心函数所在的智能合约封装进另一个智能合约中,这个智能合约只有核心智能合约的构造函数,没有核心函数,就可以顺利解决这个问题,这个思...

    个人使用的是以太坊平台,solidity编写的智能合约,solidity版本号为0.4.17

    部署智能合约暴露出的问题

    项目在部署智能合约时,会将智能合约的API和Bytecode暴露出来,可以通过API获取到项目核心函数代码,因此存在一定的安全隐患。

    如何解决

    如果将核心函数所在的智能合约封装进另一个智能合约中,这个智能合约只有核心智能合约的构造函数,没有核心函数,就可以顺利解决这个问题,这个思想也是工厂模式。

    工厂模式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

    代码思路

    将核心智能合约的构造函数封装进factory工厂中,我们只需要调用factory的deploy()函数,并传递相应的参数,调用核心智能合约的构造函数,存入map映射;声明getAddr()即可获取到当前部署智能合约的地址

    //使用智能合约部署智能合约
    contract FundingFactory{//工厂
        //存储已经部署的智能合约的地址
        uint public numFundings = 0;
        mapping(uint => address) addrfundings;
        function deploy(string _projectName, uint _supporMoney, uint _goalMoney)public{
            addrfundings[numFundings] = new Funding(_projectName, _supporMoney, _goalMoney, msg.sender);
            numFundings++;
        }
        function getAddr()public view returns(address){//拿到本次部署的智能合约地址
            return addrfundings[numFundings - 1];
        }
    }
    
    contract Funding{//核心智能合约
        //Funding智能合约构造函数
        function Funding(string _projectName, uint _supporMoney, uint _goalMoney, address _address) public{
            manager = _address;
            projectName = _projectName;
            supportMoney = _supporMoney;
            goalMoney = _goalMoney;
            endTime = now + 4 weeks;
        }
    }
    

    本人使用的是Node JS的web3.js与以太坊进行交互的,事先部署一份工厂智能合约,通过method调用工厂中的deploy()和getAddr()函数即可完成在编译器上部署智能合约

    展开全文
  • 智能合约:BUMO 智能合约介绍

    万次阅读 2019-04-29 09:37:26
    BUMO 智能合约介绍 合约定义 注意:推荐使用新的智能合约接口开发。 合约是一段JavaScript代码,标准(ECMAScriptas specified inECMA-262)。合约的初始化函数是init, 执行的入口函数是main函数,您写的合约代码...

    BUMO 智能合约介绍

    合约定义

    注意:推荐使用 新的智能合约接口 开发。

    合约是一段JavaScript代码,标准(ECMAScript as specified in ECMA-262)。合约的初始化函数是init, 执行的入口函数是main函数,您写的合约代码中必须有initmain函数的定义。该函数的入参是字符串input,是调用该合约的时候指定的。 语法请参考合约语法

    下面是一个简单的例子

    "use strict";
    function init(bar)
    {
      /*init whatever you want*/
      return;
    }
    
    function main(input)
    {
      let para = JSON.parse(input);
      if (para.do_foo)
      {
        let x = {
          'hello' : 'world'
        };
      }
    }
    
    function query(input)
    { 
      return input;
    }
    

    全局函数和内置变量

    注意:自定义的函数和变量不要与全局函数内置变量重名,否则会造成不可控的数据错误。

    全局函数

    系统提供了几个全局函数, 这些函数可以获取区块链的一些信息,也可驱动账号发起所有交易,除了设置门限和权重这两种类型的操作。

    函数读写权限

    1. 每个函数都有固定的只读或者可写权限:
    • 只读权限是指不会写数据到区块链,比如获取余额函数 getBalance 具有只读权限。

    • 可写权限是指会写数据到区块链,比如转账函数 payCoin 具有可写权限。

    1. 在编写智能合约的时候,不同的入口函数拥有不同的调用权限:
    • init 和 main 能调用所有的内置函数。
    • query 只能调用具有只读权限的函数,否则在调试或者执行过程中会提示接口未定义。

    函数返回值

    所有内部函数的调用,如果失败则返回 false 或者直接抛出异常终止执行。如果遇到参数错误,会在错误描述中提示出错的参数位置,这里的位置指参数的索引号,即从 0 开始计数。 例如,parameter 1 表示第 2 个参数错误。

    如下例子:

    issueAsset("CNY", 10000);
     /*
     错误描述:Contract execute error,issueAsset parameter 1 should be a string 指第 2 个参数应该为字符串
      */
    

    函数详情

    本章节主要介绍智能合约开发过程涉及的一些函数,包括 assertgetBalancestorageStorestorageLoadstorageDelgetAccountAssetgetBlockHashaddressCheckstoI64Checkint64Addint64Subint64Mulint64Divint64Modint64ComparetoBaseUnitlogtlogissueAssetpayAssetpayCoin

    assert

    • 函数描述

      assert 函数用于断言验证。

    • 函数调用

      assert(condition[, message]);
      
    • 参数说明

      • condition:断言变量。
      • message:可选,失败时抛出异常的消息。
    • 示例

      assert(1===1, "Not valid");
      /*
      权限:只读
      返回:成功返回 true,失败抛异常
      */
      

    getBalance

    • 函数描述

      getBalance 函数用于获取账号信息(不包含 metada 和资产信息)。

    • 函数调用

      getBalance(address);
      
    • 参数说明

      • address:账号地址。
    • 示例

      let balance = getBalance('buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY');
      /*
          权限:只读
          返回:字符串格式数字 '9999111100000'
      */
      

    storageStore

    • 函数描述

      storageStore 函数用于存储合约账号的 metadata 信息。

    • 函数调用

      storageStore(metadata_key, metadata_value);
      
    • 参数说明

      • metadata_key:metadata 的 key 值。
      • metadata_value:metadata 的 value 值。
    • 示例

      storageStore('abc', 'values');
      /* 权限:可写
          返回:成功返回true, 失败抛异常
      */
      

    storageLoad

    • 函数描述

      storageLoad 函数用于获取合约账号的 metadata 信息。

    • 函数调用

      storageLoad(metadata_key);
      
    • 参数说明

      • metadata_key:metadata 的 key 值。
    • 示例

      let value = storageLoad('abc');
      /* 权限:只读
          返回:成功返回字符串,如 'values', 失败返回 false
          本示例得到合约账号中自定数据的 abc 的值
      */
      

    storageDel

    • 函数描述

      storageDel 函数用于删除合约账号的 metadata 信息。

    • 函数调用

      storageDel(metadata_key);
      
    • 参数说明

      • metadata_key:metadata 的 key 值。
    • 示例

      storageDel('abc');
      /*
        权限:可写
        返回:成功返回 true, 失败抛异常
        本示例删除本合约账号中自定数据的 abc 的值
      */
      

    getAccountAsset

    • 函数描述

      getAccountAsset 函数用于获取某个账号的资产信息。

    • 函数调用

      getAccountAsset(account_address, asset_key);
      
    • 参数说明

      • account_address:账号地址。
      • asset_key:资产属性。
    • 示例

      let asset_key =
      {
      'issuer' : 'buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY',
      'code' : 'CNY'
      };
      let bar = getAccountAsset('buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY',
      asset_key);
      /*
      权限:只读
      返回:成功返回资产数字如'10000',失败返回 false
      */
      

    getBlockHash

    • 函数描述

      getBlockHash 函数用于获取区块信息。

    • 函数调用

      getBlockHash(offset_seq);
      
    • 参数说明

      • offset_seq:距离最后一个区块的偏移量,最大为1024。
    • 示例

      let ledger = getBlockHash(4);
      /*
      权限:只读
      返回:成功返回字符串,如
      'c2f6892eb934d56076a49f8b01aeb3f635df3d51aaed04ca521da3494451afb3',
      失败返回 false
      */
      

    addressCheck

    • 函数描述

      addressCheck 函数用于地址合法性检查。

    • 函数调用

      addressCheck(address);
      
    • 参数说明

      • address:地址参数,类型为字符串型。
    • 示例

      let ret = addressCheck('buQgmhhxLwhdUvcWijzxumUHaNqZtJpWvNsf');
      /*
      权限:只读
      返回:成功返回 true,失败返回 false
      */
      

    stoI64Check

    • 函数描述

      stoI64Check 函数用于字符串数字合法性检查。

    • 函数调用

      stoI64Check(strNumber);
      
    • 参数说明

      • strNumber:字符串数字参数。
    • 示例

      let ret = stoI64Check('12345678912345');
      /*
      权限:只读
      返回:成功返回 true,失败返回 false
      */
      

    int64Add

    • 函数描述

      int64Add 函数用于64 位加法运算。

    • 函数调用

      int64Add(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 示例

      let ret = int64Add('12345678912345', 1);
      /*
      权限:只读
      返回:成功返回字符串 '12345678912346', 失败抛异常
      */
      

    int64Sub

    • 函数描述

      int64Sub 函数用于64位减法运算。

    • 函数调用

      int64Sub(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 示例

      let ret = int64Sub('12345678912345', 1);
      /*
      权限:只读
      返回:成功返回字符串 '12345678912344',失败抛异常
      */
      

    int64Mul

    • 函数描述

      int64Mul 函数用于64位乘法运算。

    • 函数调用

      int64Mul(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 示例

      let ret = int64Mul('12345678912345', 2);
      /*
      权限:只读
      返回:成功返回字符串 '24691357824690',失败抛异常
      */
      

    int64Div

    • 函数描述

      int64Div 函数用于64位除法运算。

    • 函数调用

      int64Div(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 示例

      let ret = int64Div('12345678912345', 2);
      /*
      权限:只读
      返回:成功返回 '6172839456172',失败抛异常
      */
      

    int64Mod

    • 函数描述

      int64Mod 函数用于64位取模运算。

    • 函数调用

      int64Mod(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 示例

      let ret = int64Mod('12345678912345', 2);
      /*
      权限:只读
      返回:成功返回字符串 '1',失败抛异常
      */
      

    int64Compare

    • 函数描述

      int64Compare 函数用于64位比较运算。

    • 函数调用

      int64Compare(left_value, right_value);
      
    • 参数说明

      • left_value:左值。
      • right_value:右值。
    • 返回值

      • 1:左值大于右值。
      • 0:左值等于右值。
      • 1 :左值小于右值。
    • 示例

      let ret = int64Compare('12345678912345', 2);
      /*
      权限:只读
      返回:成功返回数字 1(左值大于右值),0(相等),-1(小于),失败抛异常
      */
      

    toBaseUnit

    • 函数描述

      toBaseUnit 函数用于变换单位。

    • 函数调用

      toBaseUnit(value);
      
    • 参数说明

      • value:被转换的数字,只能传入字符串,可以包含小数点,且小数点之后最多保留 8 位数字。
    • 示例

      let ret = toBaseUnit('12345678912');
      /*
      权限:只读
      返回:成功会返回乘以 108 的字符串,本例返回字符串 '1234567891200000000',失败抛异常
      */
      

    log

    • 函数描述

      log 函数用于输出日志。

    • 函数调用

      log(info);
      
    • 参数说明

      • info:日志内容。
    • 示例

       let ret = log('buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY');
       /*
       权限:只读
       返回:成功无返回值,失败返回 false
       */
      

    tlog

    • 函数描述

      tlog 函数用于输出交易日志,调用该函数会产生一笔交易写在区块上。

    • 函数调用

      tlog(topic,args...);
      
    • 参数说明

      • topic:日志主题,必须为字符串类型,参数长度为(0,128]。
      • args...:最多可以包含 5 个参数,参数类型可以是字符串、数值或者布尔类型,每个参数长度为 (0,1024]。
    • 示例

       tlog('transfer',sender +' transfer 1000',true);
       /*
       权限:可写
       返回:成功返回 true,失败抛异常
       */
      

    issueAsset

    • 函数描述

      issueAsset 函数用于发行资产。

    • 函数调用

      issueAsset(code, amount);
      
    • 参数说明

      • code:资产代码。
      • amount:发行资产数量。
    • 示例

       issueAsset("CNY", "10000");
       /*
       权限:可写
       返回:成功返回 true,失败抛异常
       */
      

    payAsset

    • 函数描述

      payAsset 函数用于转移资产。

    • 函数调用

      payAsset(address, issuer, code, amount[, input]);
      
    • 参数说明

      • address:转移资产的目标地址。
      • issuer:资产发行方。
      • code:资产代码。
      • amount:转移资产的数量。
      • input:可选,合约参数,默认为空字符串。
    • 示例

       payAsset("buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY",
       "buQgmhhxLwhdUvcWijzxumUHaNqZtJpWvNsf", "CNY", "10000", "{}");
       /*
       权限:可写
       返回:成功返回 true,失败抛异常
       */
      

    payCoin

    • 函数描述

      payCoin 函数用于转账资产。

    • 函数调用

      payCoin(address, amount[, input]);
      
    • 参数说明

      • address:发送 BU 的目标地址。
      • amount:发送 BU 的数量。
      • input:可选,合约参数,默认为空字符串。
    • 示例

       payCoin("buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY", "10000", "{}");
       /*
       权限:可写
       返回:成功返回 true,失败抛异常
       */
      

    内置变量

    本章节介绍智能合约开发过程涉及的一些内置变量,包括 thisAddress、 thisPayCoinAmount、 thisPayAsset、 blockNumber、 blockTimestamp、 sender、 triggerIndex

    thisAddress

    • 变量描述

      内置变量 thisAddress 的值等于该合约账号的地址。

    • 示例

      例如,账号 x 发起了一笔交易调用合约 Y ,本次执行过程中,thisAddress 的值就是 Y 合约账号的地址。

      let bar = thisAddress;
        /*
        bar的值是Y合约的账号地址。
      */
      

    thisPayCoinAmount

    • 变量描述

      本次支付操作的 BU Coin。

    thisPayAsset

    • 变量描述

      本次支付操作的 Asset,为对象类型,如下:

    • 示例

      {
          "amount": 1000, 
          "key": {
              "issuer": "buQsZNDpqHJZ4g5hz47CqVMk5154w1bHKsHY", 
              "code":"CNY"
          }
      }
      

    blockNumber

    • 变量描述

      当前区块高度。

    blockTimestamp

    • 变量描述

      当前区块时间戳。

    sender

    • 变量描述

      调用者的地址。sender 的值为本次调用该合约的账号。

    • 示例

      例如,某账号发起了一笔交易,该交易中某个操作是调用合约 Y(该操作的 source_address 是 x),那么在合约 Y 的执行过程中,sender 的值就是 x 账号的地址。

      let bar = sender;
      /*
      那么bar的值是x的账号地址。
      */
      

    triggerIndex

    • 变量描述 triggerIndex 的值为触发本次合约的操作的序号。

    • 示例

      例如,某账号 A 发起了一笔交易 tx0,tx0 中第 0(从 0 开始计数)个操作是给某个合约账户转移资产(调用合约),那么 triggerIndex 的值就是 0。

       let bar = triggerIndex;
        /*
         bar 是一个非负整数
       */
      

    异常处理

    • JavaScript异常

      当合约运行中出现未捕获的JavaScript异常时,处理规定:

      1. 本次合约执行失败,合约中做的所有交易都不会生效。
      2. 触发本次合约的这笔交易为失败。错误代码为151
    • 执行交易失败

      合约中可以执行多个交易,只要有一个交易失败,就会抛出异常,导致整个交易失败

    展开全文
  • 智能合约:BUMO 智能合约语法说明

    万次阅读 2019-04-29 09:39:18
    BUMO 智能合约语法说明 概述 Bumo 智能合约使用JaveScript语言编写,为了方便开发者更规范的,更安全的开发合约,在做合约语法检测时候,使用了 JSLint 做限制。参考JSLint GitHub。编辑合约时候,首先需要在 ...

    BUMO 智能合约语法说明

    概述

    Bumo 智能合约使用 JaveScript 语言编写,为了方便开发者更规范的,更安全的开发合约,在做合约语法检测时候,使用了 JSLint 做限制。参考JSLint GitHub。编辑合约时候,首先需要在 JSLint 里检测通过,才可以被 Bumo 系统检测为一个合法的合约。

    JSLint 的标准语法在官方网站有详尽的说明。本文档的目的是作为一个完善文档,整理了原有的 JSLint 语法规则,同时对 Bumo 修改后的规则进行了补充说明,文档会举例说明其用法。对于本文没有提到的部分,请参考 JsLint 帮助手册

    或者通过节点服务器、钱包地址访问文档 127.0.0.1:36002/jslint/help.html

    检测工具

    JSLint 检测工具地址:JSLint 语法检测工具

    或者通过节点服务器、钱包地址使用工具 127.0.0.1:36002/jslint/index.html

    错误说明,在 web 工具里调试合约语法时候,会有详尽的错误描述。当输入如下代码时候

    
    "use strict";
    function init(bar)
    {
        
    }
    

    错误如下

    Empty block.   2.0
    {
    

    错误原因:空的语句块,在第 2 行,第 0 列。

    正确的代码如下:

    
    "use strict";
    function init(bar)
    {
        return;    
    }
    

    正确的检测结果,不会报出红色的 Warnings 信息

    文本压缩

    合约文档写好之后,可以使用 JSMin 工具进行压缩,注意保存原文档,压缩是不可逆的操作。

    工具地址

    Demo

    
    "use strict";
    function init(bar)
    {
        /*init whatever you want*/
        return;
    }
    
    function main(input) 
    {
        log(input);
    
        //for statement
        let i;
        for (i = 0; i < 5; i += 1) 
        {
            log(i);
        }
    
        //while statement
        let b = 10;
        while (b !== 0) 
        {
            b -= 1;
            log(b);
        }
    
        //if statement
        let compare = 1;
        if(compare === 1)
        {
            log("it is one");
        }
        else if(compare === 2)
        {
            log("it is two");
        }
        else
        {
            log("it is other");
        }
    
        //if statement
        if(compare !== 2)
        {
            log("no, different");
        }
    
        //switch statement
        let sw_value = 1;
        switch(sw_value)
        {
        case 1:
            log("switch 1");
            break;
        default:
            log("default");
        }
    
        //Number
        let my_num = Number(111);
        log(my_num);
    
        //String
        let my_str = String(111);
        log(my_str);
    
        //Boolean
        let my_bool = Boolean(111);
        log(my_bool);
    
        //Array
        let str_array = ["red","black"]; 
        log(str_array);
    
        //Array
        let num_array = [1,2,3,4];
        log(num_array);
    
        throw "this is a exception";
    }
    

    规则列表

    • 严格检测声明,所有的源码在开始必须要添加 "use strict"; 字段

    • 语句块内尽量使用 let 声明变量

    • 使用=== 代替 == 判断比较;使用 !== 代替 != 比较

    • 语句必须以 ; 结束

    • 语句块必须用 {} 包括起来,且禁止空语句块

    • for 的循环变量初始变量需在条件语句块之前声明,每次使用重新赋值

    • 禁用 ++ 和 --,使用 += 和 -= 替代

    • 禁止使用 evalvoid 关键字

    • 禁止使用 new 创建 NumberStringBoolean对象,可以使用其构造调用来获取对象

    • 禁止使用的数组关键字创建数组

    • 禁止使用 trycatch 关键字,可以使用 throw 手动抛出异常

    "Array", "ArrayBuffer", "Float32Array", "Float64Array", 
    "Int8Array", "Int16Array", "Int32Array", "Uint8Array", 
    "Uint8ClampedArray", "Uint16Array", "Uint32Array"
    
    let color = new Array(100); //编译报错
    
    //可以使用替代 new Array(100) 语句;
    let color = ["red","black"]; 
    let arr = [1,2,3,4];
    
    • 禁止使用的关键字
    "DataView", "decodeURI", "decodeURIComponent", "encodeURI", 
    "encodeURIComponent", "Generator","GeneratorFunction", "Intl", 
    "Promise", "Proxy", "Reflect", "System", "URIError", "WeakMap", 
    "WeakSet", "Math", "Date"
    展开全文
  • 外部账户给部署智能合约时给合约初始转账: 使用remix 测试环境 pragma solidity >=0.4.0 <0.7.0; contract Test{ uint256 public test1; //保存指定地址的合约的余额 address payable owner; //保存...
  • 金融合约与智能合约

    万次阅读 2019-04-02 09:26:01
    由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境,以太坊首先看到了区块链和智能合约的契合,发布了白皮书...
  • 智能合约是一个很容易引起争议的概念,甚至 Vitalik 也曾经说过后悔是用smart contract(智能合约)这个名字,不如当初叫“persistent scripts”。大概意思就是这就是一段程序脚本,哪里智能了,应该改成自动合约,这...
  • BUMO 智能合约开发(新接口) 概述 BUMO 智能合约是一段JavaScript代码,标准(ECMAScript as specified in ECMA-262)。合约的初始化函数是init, 执行的入口函数是main函数,查询接口是query。这些函数的参数字符串...
  • Nick Szabo提出了“智能合约”的概念,其目的是将POS(销售点)等电子交易方式的功能扩展到数字领域。 智能合约可以避免第三方中间商的服务,帮助您以透明、无冲突的方式交换财产、股份或任何有价值的东西。 以下是...
  • 去中心化智能合约,也就是说是基于区块链高度自由的智能合约,是真正的区块链智能合约 DAPP,所有制度规则部署在(波场币)公链上,永远无法篡改。每个参与者都可以是中心! 2021年九环DeFi国际公链巅峰之作,国际
  • 智能合约白皮书

    2016-12-15 19:32:22
    近日,在微软纽约市总部举行了‘ 首届智能合约专题研讨会 ’,来自区块链领域的企业和专家聚在一起讨论了智能合约在2017年以及更远的未来颠覆现状的各种方式,并正式发布长达56页的‘智能合约白皮书’。
  • 以太坊智能合约项目实战

    万人学习 2019-01-15 13:51:27
    通过这个课程的学习,我们可以了解以太坊发展的轨迹,学会洞察智能合约的漏洞,学会如何发币以及具备一定的智能合约开发技能,让学习者在区块链的大潮中立于不败之地。 本科主要介绍5个智能合约项目,包括1.奖金发放...
  • 在本文的这个以太坊智能合约教程中,我们将了解如何使用Truffle Ethereum和以太坊专用网络来执行智能合约。 我们将在以太坊智能合约教程中查看以下主题: 使用案例:保险流程中的智能合约 智能合约的好处 安装先决...
  • 智能合约简介

    2019-01-26 13:46:05
    智能合约 The DAO 以太坊主要的特性 部署运行 智能合约 (Smart Contract) 部署在去中心化的平台上的一种自动自行的电子合约。 智能合约的风险案例 (The DAO) 合约一旦部署成功很难更改,计算机程序难免出现...
  • (六)Fabric2.0 智能合约实践- 升级智能合约

    千次阅读 热门讨论 2020-02-15 22:02:20
    总目录: (一)HyperLedger Fabric 2.0-release测试网络部署 ...(五)Fabric2.0 智能合约实践- 安装以及定义智能合约 目录1.查看需要升级的智能合约信息2 修改合约代码3. 重新打包合约4. 重新安装合约5.修改合...
  • 最近开始学习智能合约,发现这个东西挺有意思。后期会将自己所写的所有合约都一一记录。欢迎大家交流。 下面这个合约实现的功能为:首先保证合约里面有eth,每调用一次智能合约,就会从智能合约获取一笔eth,称为...
  • 智能合约不智能

    千次阅读 2017-10-10 09:56:08
    作者:井通科技CTO 杨建新 区块链概念从2015年起源,截止...智能合约原是Nick Szabo在1994年他的论文《智能合约》(Smart Contract)中首次提出智能合约的概念,Nick对智能合约的描述是“highly evolved practi
  • 智能合约内部调用另一个智能合约

    千次阅读 2018-10-16 19:11:18
    最近在看以太坊,顺便记录一下,这篇文章的目的是一个智能合约调用另一个智能合约的方法,写个demo记录一下 pragma solidity ^0.4.18; contract DataContract { mapping (address =&gt; uint256) public ...
  • 智能合约12个案例

    2019-01-12 11:41:25
    智能合约12个案例分享。通过对智能合约在12个案例的实践,总结出智能合约的应用之道。
  • BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理、运行原理 SC与传统合约的比较 1、传统合约VS智能合约 特点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,069
精华内容 6,427
关键字:

智能合约