Show / Hide Table of Contents

介绍

什么是智能合约?

智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。区块链技术给我们带来了一个去中心化的,不可篡改的,高可靠性的系统,在这种环境下,智能合约才大有用武之地。智能合约是区块链最重要的特性之一,也是区块链能够被称为颠覆性技术的主要原因。

Neo 智能合约有哪些特点?

Neo 智能合约 2.0 包括以下特性:确定性、高性能、拓展性。其合约类型包括:验证合约和应用合约。

从性能角度来说,Neo 采用了轻量级的 NeoVM(Neo Virtual Machine)作为其智能合约的执行环境,其启动速度非常快,占用资源也很小,适合像智能合约这样短小的程序。通过 JIT(即时编译器)技术对热点智能合约进行静态编译和缓存可以显著提升。Neo 虚拟机的指令集中内建提供了一系列的密码学指令,以优化智能合约中用到密码学算法时的执行效率。此外,数据操作指令直接对数组及复杂数据结构提供支持。这些都会提升 Neo 智能合约 2.0的运行性能。

Neo 智能合约 2.0实现可拓展性的方法是通过高并发和动态分区的形式,结合其低耦合的设计完成的。低耦合合约程序在一个虚拟机(Neo 虚拟机)中执行,并通过交互服务层与外部通信。因此,对智能合约功能的绝大部分升级,都可以通过增加交互服务层的 API 来实现。

用什么语言编写智能合约?

从语言角度看 Neo 智能合约 2.0与以太坊的区别更为直观:与以太坊原创的 Solidity 语言不同,Neo 智能合约开发者可以直接使用几乎任何他们擅长的高级语言来进行 Neo 智能合约的开发工作。Neo 提供了这些语言的编译器和插件,用于将高级语言编译成 Neo 虚拟机所支持的指令集。由于编译器会针对 MSIL(微软中间语言)来进行编译,所以理论上任何.Net 中的语言或者可被转译成 MSIL 的语言都可以直接支持。

当前已经支持的语言有:

  • C#、VB.Net、F#

  • Java、Kotlin

  • Python

  • GO

  • JavaScript

未来计划陆续加入的高级语言还包括:

  • C、C++

多种高级语言的支持,使得 90% 以上的开发者无需学习新的语言即可参与到 Neo 智能合约的开发中来,甚至可将现有业务系统中的代码直接移植到区块链上。这将大大增加未来区块链的全面普及。

最后从调试角度看,通常智能合约的开发过程是非常困难的,重要的原因之一是此前的智能合约缺乏良好的调试和测试方法。Neo 在 NeoVM 层面提供了程序调试功能的支持,使得开发 Neo 智能合约 2.0变得更方便快捷。

智能合约的触发

Neo 的智能合约有两种触发方式:

  • 合约用户的鉴权:智能合约作为一个合约账户,当用户使用该合约账户里的一笔资产时,会触发该智能合约。

  • 手动发送交易调用智能合约:用户发送一笔交易(Invocation Transaction )来触发一段智能合约的执行。

一个合约可以同时由以上两种方式触发。由于鉴权触发的合约是UTXO模型的鉴证过程,是在交易被写入区块之前执行。如果合约返回false或者发生异常,则交易不会被写入区块。

而由交易调用触发的合约,它的调用时机是交易被写入区块以后,此时无论应用合约返回为何以及是否失败,交易都已经发生,无法影响交易中的 UTXO 资产状态。

NeoVM 虚拟机

NeoVM 是执行 Neo 智能合约代码的虚拟机。这里所讲述的虚拟机概念比较狭义,并非是借助于操作系统对物理机器的一种模拟,这里的虚拟机与 vmware 或者 Hyper-V 不同,是针对具体语言所实现的虚拟机。

例如在 java 的 JVM 或者 .Net 的 CLR 中,java 或者 .Net 源码会被编译成相关字节码,然后在对应虚拟机上运行, JVM 或 CLR 会对这些字节码进行取指令,译码,执行,结果回写等操作,这些步骤和真实物理机器上的概念都很相似。相对应的二进制指令仍然是在物理机器上运行,物理机器从内存中取指令,通过总线传输到 CPU,然后译码、执行、结果存储。更多信息,请参阅 NeoVM 指令集

收费模式

Neo 智能合约在部署或者执行的时候都要缴纳一定的手续费,分为部署费用和执行费用。

部署费用是指开发者将一个智能合约部署到区块链上需要向区块链系统支付一定的费用,根据合约所需功能,系统将收取100~ 1000 GAS 的费用,并作为系统收益。

执行费用是指每执行一条智能合约的指令都会向 Neo 系统支付一定的执行费用。

具体收费标准请参阅 智能合约费用

一些简单的智能合约(C#)

下面是一些简单的 C# 智能合约:

public static bool Main()
{
    return true;
}

该合约的返回值永远为 true,表示任何人都可以花费这个合约地址里的资产(可以理解为撒钱)。

Neo 钱包客户端有删除资产功能,当你删除了一个资产,这个资产实际上发送到了一个指定地址中,这个地址就是上述智能合约所生成的合约地址,任何人都可以花费这个地址里的资产,当然这个地址里的资产都是别人不想要的资产。

public static bool Main()
{
    return false;
}

该合约的返回值永远为 false,表示这个合约里的资产无人能使用(可以理解为烧钱或销毁一笔资产),比如里面可以存储一些已注销的公司的股权。

更多示例请查看:

Hello World

Lock(锁仓合约)

Domain(域名系统)