智能合约平台[深入研究]

在本指南中,我们将介绍一些智能合约平台,看看有什么与众不同。其中一些已经在工作,而一些正在开发中.

我们生活在智能合约时代。虽然比特币可能已经向我们表明,支付系统可以存在于分散的点对点气氛中。然而,随着以太坊的到来,闸门才得以真正开启。以太坊迎来了第二代区块链时代,人们终于看到了以太坊的真正潜力 Dapps和智能合约s.

深入了解不同的智能合约平台

在开始之前,先问一个问题.

什么是智能合约?

智能合约是自动化合约。它们使用在其代码上编写的特定指令自行执行,这些指令在满足特定条件时执行.

深入了解不同的智能合约平台

您可以在此处的深入指南中了解有关智能合约的更多信息.

那么,我们在智能合约中想要的理想属性是什么??

在区块链上运行的任何事物都必须是不可变的,并且必须具有在不损害其完整性的情况下跨多个节点运行的能力。因此,智能合约功能需要具备以下三点:

  • 确定性.
  • 终结的.
  • 隔离的.

功能1:确定性

如果程序每次都将相同的输出提供给给定的输入,则该程序是确定性的。例如。如果3 + 1 = 4,则3 + 1始终为4(假设基数相同)。因此,当程序将相同的输出提供给不同计算机中的相同输入集时,该程序称为确定性.

在各种情况下,程序可能无法确定地采取行动:

  • 调用不确定的系统函数:当程序员在其程序中调用不确定函数时.

  • 不确定的数据资源:如果程序在运行时期间获取数据,并且该数据源不确定,则该程序将变得不确定。例如。假设有一个程序可以获取特定查询的前10个Google搜索。列表可能会不断变化.

  • 动态通话:当程序调用第二个程序时,称为动态调用。由于仅在执行期间确定调用目标,因此本质上是不确定的.

功能2:终结

在数学逻辑中,我们有一个称为“停止问题”的错误。基本上,它指出无法知道给定程序是否可以在一个时限内执行其功能。 1936年,艾伦·图灵(Alan Turing)使用康托尔(Cantor)的对角线问题推论得出,没有办法知道给定程序是否可以在一定时限内完成.

这显然是智能合约的问题,因为根据定义,合约必须能够在给定的期限内终止。已采取一些措施来确保有一种方法可以从外部“杀死”合同,并且不会陷入无休止的循环,从而浪费资源:

  • 图灵不完整:图灵不完整的区块链功能有限,无法进行跳转和/或循环。因此,他们无法进入无限循环.

  • 计步器:程序可以简单地跟踪已执行的“步数”,即已执行的指令数,然后在执行特定的步数后终止。另一种方法是收费表。在这里,合同是通过预付费执行的。每条指令的执行都需要一定的费用。如果所花费的费用超过预付款的费用,则合同终止.

  • 计时器:此处保留了预定的计时器。如果合同执行超过了时限,那么它将在外部中止.

功能3:隔离

在区块链中,任何人和所有人都可以上传智能合约。但是,因此,合同可能在有意和无意的情况下包含病毒和错误.

如果合同不是孤立的,则可能会妨碍整个系统。因此,将合同隔离在沙盒中对于保护整个生态系统免受任何负面影响至关重要.

既然我们已经看到了这些功能,那么了解它们的执行方式就很重要。通常,智能合约使用以下两个系统之一运行:

  • 虚拟机:以太坊和Neo使用此
  • 码头工人:面料使用此.

让我们比较一下这两个因素,并确定哪个因素可以改善生态系统。为了简单起见,我们将比较以太坊(虚拟机)和Fabric(Docker).

深入了解不同的智能合约平台

因此,可以看出,虚拟机为智能合约提供了更好的确定性,可终结性和隔离性环境.

好的,现在我们知道什么是智能合约,以及虚拟机是智能合约更好的平台这一事实。让我们看看Dapps到底需要什么才能有效运行.

Dapps需要什么?

或者,更具体地说,DAPP要取得成功并受到主流受众的欢迎,需要具备什么条件?绝对最低要求是多少?

支持数百万用户

它应该具有足够的可伸缩性,以使数百万的用户可以使用它。对于寻求主流接受的DAPP尤其如此.

免费使用

该平台应使开发人员能够创建可供用户免费使用的Dapp。无需用户支付平台即可获得Dapp的好处.

容易升级

该平台应允许开发人员在需要时自由升级Dapp。另外,如果某些错误确实影响了Dapp,则开发人员应该能够在不影响平台的情况下修复DAPP.

低延迟

DAPP应该尽可能平稳地运行并以尽可能低的延迟运行.

平行性能

平台应允许并行处理其Dapp,以分配工作负载并节省时间.

顺序表现

但是,并不是区块链上的所有功能都应该那样做。考虑事务执行本身。多个交易不能并行执行;必须一次完成一次,以避免重复支出之类的错误.

那么,关于DAPP创建,我们可以使用哪些平台??

BitShares和Graphene具有良好的吞吐量,但绝对不适合智能合约.

以太坊显然是市场上最明显的选择。它具有惊人的智能合约功能,但低交易速度是一个主要问题。另外,汽油价格也会成问题.

好的,现在我们知道了Dapp的需求,让我们来看一些智能合约平台.

我们将研究:

  • 以太坊

  • EOS

  • 恒星

  • 卡尔达诺

  • 超级账本面料

深入了解不同的智能合约平台

以太坊

首先,我们有以太坊,这是一切的开始.

这是以太坊网站的定义:

“以太坊是一个运行智能合约的去中心化平台:应用程序完全按照程序运行,不会造成停机,审查,欺诈或 第三方 干涉。这些应用程序运行在定制的区块链上,区块链是一个功能强大的共享全球基础架构,可以转移价值并代表财产所有权。”

但是简单来说,以太坊计划成为未来的终极软件平台。如果未来去中心化并且Dapps变得司空见惯,那么以太坊必须成为它的前沿和中心.

以太坊虚拟机或EVM是其中所有智能合约在以太坊中起作用的虚拟机。它是一个简单但功能强大的Turing Complete 256位虚拟机。 Turing Complete意味着,只要有足够的资源和内存,在EVM中执行的任何程序都可以解决任何问题.

为了在EVM中编码智能合约,需要学习编程语言Solidity.

Solidity是一种有意精简的,松散类型的语言,其语法与ECMAScript(Javascript)非常相似。以太坊设计基本原理文档中有一些要记住的要点,即我们正在使用具有32字节指令字长的堆栈模型,通过EVM(以太坊虚拟机),我们可以访问程序“堆栈”,就像是一个寄存器空间,我们还可以在其中粘贴内存地址以使程序计数器循环/跳转(用于顺序程序控制),可扩展的临时“内存”和更永久的“存储”,该内容实际上已写入永久性区块链,最重要的是,EVM需要在智能合约中进行全面确定性.

因此,在继续之前,我们来看一个基本的Solidity合同示例。 (代码取自github).

让我们运行一个简单的while循环来实现稳定性:

合约BasicIterator

{

地址创建者; //保留一个 "地址"-类型点

uint8 [10]整数; //在数组中为10个8位无符号整数保留一块存储空间

函数BasicIterator()

{

creator = msg.sender;

uint8 x = 0;

//第1节:分配值

而(x < integers.length){

整数[x] = x;

x ++;

}}

函数getSum()常量返回(uint){

uint8 sum = 0;

uint8 x = 0;

//第2节:在数组中添加整数.

而(x < integers.length){

sum =和+整数[x];

x ++;

}

返回总和

}

//第3节:取消合同

函数kill()

{

如果(msg.sender ==创建者)

{

自杀(创造者);

}

}

}

因此,让我们分析一下代码。为了便于理解,我们将代码分为3部分.

第1节:赋值

第一步,我们填充一个名为“ integers”的数组,该数组接受10个8位无符号整数。我们这样做的方式是通过while循环。让我们看看while循环内发生了什么.

而(x < integers.length){

整数[x] = x;

x ++;

}

请记住,我们已经为整数x分配了“ 0”值。 while循环从0到integers.length。 Integers.length是一个返回数组最大容量的函数。因此,如果我们决定一个数组将有10个整数,则arrayname.length将返回值10。在上面的循环中,x的值从0到9(<10),并将其自身的值也分配给integers数组。因此,在循环结束时,整数将具有以下值:

0,1,2,3,4,5,6,7,8,9.

第2节:添加数组内容

在getSum()函数内部,我们将添加数组本身的内容。要做到这一点的方法是,重复上述相同的while循环,并使用变量“ sum”添加数组的内容.

第三节:取消合同

此功能可终止合同,并将合同中的剩余资金退还给合同创建者.

什么是煤气?

“气体”是以太坊生态系统的命脉,没有其他方法可以做到这一点。 Gas是衡量执行某些操作所需的计算量的单位.

参与以太坊的每一项操作,无论是简单的交易,还是智能合约,甚至ICO都需要一定量的天然气。 Gas是用于计算执行操作所需支付给网络的费用数量的方法.

当某人提交智能合约时,它具有预定的天然气价值。执行合同时,合同的每个步骤都需要一定量的天然气才能执行.

这可能导致两种情况:

  1. 所需气体超过设定的限制。如果是这种情况,那么合同的状态将恢复为原始状态,并且所有的气体都用光了.

        2.所需的气体少于设定的限制。如果是这样,那么合同就完成了,剩余的气体交给了合同制定者.

以太坊可能已经为智能合约铺平了道路。它确实面临一些可伸缩性问题。但是,等离子,雷电,分片等创新可能会解决此问题。.

EOS

深入了解不同的智能合约平台

EOS旨在成为一种分散式操作系统,以支持工业规模的分散式应用程序.

这听起来很令人惊奇,但真正引起公众想象的是以下两个说法:

  • 他们计划完全取消交易费用.

  • 他们声称每秒能够进行数百万笔交易.

这两个功能是Dapp开发人员着迷于EOS的原因。让我们看一下EOS如何实现这两个目标.

免除费用

EOS采用所有权模型,用户可以拥有并有权使用与其所占权益成比例的资源,而不必为每笔交易付费。因此,实质上,如果您持有N个EOS令牌,那么您有权进行N * k个交易。从本质上讲,这消除了交易费用.

对于想在区块链上测试其应用程序的开发人员而言,在以太坊上运行和托管应用程序的成本可能很高。开发初期涉及的汽油价格足以关闭新开发者.

以太坊和EOS运作方式之间的根本区别在于,以太坊将其计算能力出租给开发人员,而EOS则拥有其资源的所有权。因此,实质上,如果您拥有EOS的1/1000股份,那么您将拥有EOS总计算能力和资源的1/1000的所有权。.

正如ico-reviews在其文章中所述:

“ EOS的所有权模型为DAPP开发人员提供了可预测的托管成本,要求他们仅维持一定比例或一定比例的股份,并使得创建免费增值应用程序成为可能。此外,由于EOS令牌持有者将能够将其资源份额出租/转让给其他开发商,因此所有权模型将EOS令牌的价值与带宽和存储的供求联系在一起。”

可扩展性增强

EOS通过其DPOS共识机制获得了可扩展性。 DPOS代表委托的权益证明,其工作方式如下:

首先,任何在集成到EOS软件中的区块链上持有代币的人都可以通过持续批准投票系统选择区块生产者。任何人都可以参加大块生产者选举,他们将有机会生产与他们相对于所有其他生产者的总票数成比例的块.

它是如何工作的?

  • 方块在21轮中产生.

  • 在每个回合开始时,都会选择21个区块生产者。自动选择前20名,而选择第21名则与他们相对于其他制作人的票数成正比.

  • 然后使用从块时间得出的伪随机数对生产者进行混洗。这样做是为了确保与所有其他生产者之间的连接性保持平衡。.

  • 为了确保维持常规的区块生产并将区块时间保持在3秒,生产者因未参与而受到惩罚,将其从考虑范围中删除。生产者必须每24小时生产至少一个块才能考虑.

由于参与共识的人很少,因此它比以太坊和比特币更快,更集中,后者使用整个网络达成共识.

WASM语言

EOS使用WebAssembly或WASM编程语言。他们之所以使用它,是因为它具有以下特性(来自webassembly.org):

  • 速度与效率:WebAssembly通过利用广泛平台上可用的通用硬件功能以本机速度执行.

  • 开放且可调试:设计为以文本格式漂亮地打印,以便手动调试,测试,实验,优化,学习,教学和编写程序.

  • 安全的:WebAssembly描述了一种内存安全的沙盒执行环境,该环境甚至可以在现有的JavaScript虚拟机内部实现.

EOS是创建工业规模Dapps的理想平台。假设您正在创建一个分散的Twitter。如果您在以太坊上创建它,那么用户将不得不在执行推文的每个步骤时花费一些精力.

如果您在EOS中做过同样的事情,则用户无需花钱,因为交易费用为0!但是,由于EOS的分散程度不如以太坊,因此要求高度防审查性的Dapps可能不太适合.

恒星

深入了解不同的智能合约平台Stellar是Jed McCaleb的创意,Joyce Kim于2014年从Ripple协议中派生时成立。恒星,根据他们的网站,

是连接银行,支付系统和人员的平台。集成以快速,可靠,几乎没有成本地转移资金”.

使用Stellar,您可以快速,可靠地跨境转移资金,只需花费一分钱.

与以太坊不同,恒星智能合约(SSC)并非图灵完整的。下表很好地了解了Stellar和以太坊智能合约之间的区别:

深入了解不同的智能合约平台

图片来源:Hackernoon

一些统计信息可能会立即弹出.

最值得注意的是,5秒的确认时间以及Stellar网络上的单笔交易仅需花费约0.0000002美元的事实!

$ stellarNetwork->buildTransaction($ customerKeypair)

->addCreateAccountOp($ escrowKeypair,100.00006)//设置费+转移交易后100 XLM

->提交($ customerKeypair);

}

打印 "创建的托管帐户: " . $ escrowKeypair->getPublicKey()。 PHP_EOL;

/ *

*为了使其成为托管帐户,我们需要向工作人员证明

*当工人正在寻找时,没有人能够从中提取资金

*虚荣地址.

*

*通过以下方式完成

*-使工作人员和客户签名者的权重相等(1)

*-要求两个签名者都同意任何交易(阈值设置为2)

*

*但是,我们还需要处理没有工人接任的情况,而我们

*需要收回该帐户。这可以通过添加预授权的合并来完成

*从现在起30天内无效的交易.

*

*这使工人知道保证有可用资金

* 30天.

* /

//加载托管账户

$ account = $ stellarNetwork->getAccount($ escrowKeypair);

//预先计算一些序列号,因为它们对于交易是必需的

$ startingSequenceNumber = $帐户->getSequence();

//跟踪设置托管账户所需的交易数量

//我们需要这个,以便我们可以正确计算 "收回账户" 序列号

$ numSetupTransactions = 5;

$ reclaimAccountOrPaySeqNum = $ startingSequenceNumber + $ numSetupTransactions + 1;

//使用指示要搜索的虚荣地址的数据值更新帐户

打印 "添加数据条目以请求虚荣地址…";

$ stellarNetwork->buildTransaction($ escrowKeypair)

->setAccountData(’request:generateVanityAddress’,’G * ZULU’)

->提交($ escrowKeypair);

打印 "完毕" . PHP_EOL;

//后备交易:如果没有工作人员生成托管交易,则收回托管账户

// 30天后的虚荣地址

$ reclaimTx = $ stellarNetwork->buildTransaction($ escrowKeypair)

->setSequenceNumber(new BigInteger($ reclaimAccountOrPaySeqNum))

// todo:在​​实际实现中取消注释

//->setLowerTimebound(new \ DateTime(’+ 30 days’))

->setAccountData(’request:generateVanityAddress’)

->addMergeOperation($ customerKeypair)

->getTransactionEnvelope();

//在帐户上添加$ reclaimTx哈希作为签名人

//参见:https://www.stellar.org/developers/guides/concepts/multi-sig.html#pre-authorized-transaction

$ txHashSigner =新签名者(

SignerKey :: fromPreauthorizedHash($ reclaimTx->getHash()),

2 //重量必须足够,因此不需要其他签名者

);

$ addReclaimTxSignerOp = new SetOptionsOp();

$ addReclaimTxSignerOp->updateSigner($ txHashSigner);

打印 "将预授权的回收交易添加为签名人… ";

$ stellarNetwork->buildTransaction($ escrowKeypair)

->addOperation($ addReclaimTxSignerOp)

->提交($ escrowKeypair);

打印 "完毕" . PHP_EOL;

打印 "添加了按顺序有效的预身份验证回收事务 " . $ reclaimAccountOrPaySeqNum。 PHP_EOL;

打印 "要收回托管帐户,请运行90-reclaim-escrow.php" . PHP_EOL;

//将工作人员帐户添加为权重为1的签名者

$ workerSigner =新签名者(

SignerKey :: fromKeypair($ workerKeypair),

1 //需要另一个签名者

);

$ addSignerOp = new SetOptionsOp();

$ addSignerOp->updateSigner($ workerSigner);

$ stellarNetwork->buildTransaction($ escrowKeypair)

->addOperation($ addSignerOp)

->提交($ escrowKeypair);

//将客户帐户添加为权重1的第二个签名者

$ workerSigner =新签名者(

SignerKey :: fromKeypair($ customerKeypair),

1 //需要另一个签名者

);

$ addSignerOp = new SetOptionsOp();

$ addSignerOp->updateSigner($ workerSigner);

$ stellarNetwork->buildTransaction($ escrowKeypair)

->addOperation($ addSignerOp)

->提交($ escrowKeypair);

//增加阈值并将主权重设置为0

//所有操作现在都要求阈值为2

$ thresholdsOp = new SetOptionsOp();

$ thresholdsOp->setLowThreshold(2);

$ thresholdsOp->setMediumThreshold(2);

$ thresholdsOp->setHighThreshold(2);

$ thresholdsOp->setMasterWeight(0);

$ stellarNetwork->buildTransaction($ escrowKeypair)

->addOperation($ thresholdsOp)

->提交($ escrowKeypair);

打印PHP_EOL;

打印 "完成配置托管帐户" . PHP_EOL;

卡尔达诺

深入了解不同的智能合约平台

Cardano是最有趣的项目之一。与以太坊类似,Cardano是一个智能合约平台,但Cardano通过分层架构提供可伸缩性和安全性。卡尔达诺的方法是建立在科学哲学和同行评审的学术研究之上的,因此在该领域本身是独一无二的

卡尔达诺旨在通过其Ouroboros股权证明共识机制来提高可扩展性。为了在Cardano中编码智能合约,您将需要使用基于Haskell的Plutus,Haskell是用于对Cardano进行编码的语言.

C ++和大多数传统语言是命令式编程语言,而Plutus和Haskell是功能性编程语言.

那么,函数式编程是如何工作的?

假设我们要使用一个函数f(x)来计算一个函数g(x),然后我们要使用它与函数h(x)一起使用。不必按顺序解决所有这些问题,我们可以将所有这些简单地合并到一个函数中,如下所示:

h(g(f(x)))

这使得函数方法更容易进行数学推理。这就是为什么功能程序被认为是创建智能合约的一种更安全的方法。这也有助于简化形式验证,这在很大程度上意味着更容易数学上证明程序的功能以及其工作方式。这为卡尔达诺提供了“高保证码”财产.

让我们以一个真实的例子为例,看看为什么它在某些情况下变得极为关键甚至可以挽救生命.

假设我们正在编写一个控制空中交通的程序.

可以想象,对这样的系统进行编码需要很高的精度和准确性。当人们的生命受到威胁时,我们不能盲目地编写某些代码,并希望做到最好。在这种情况下,我们需要可以证明在数学上具有高度确定性的代码.

这就是为什么功能性方法如此理想的原因.

这正是Cardano使用Haskell为其智能合约编码其生态系统和Plutus的方式。 Haskell和Plutus都是功能语言.

下表将命令式方法与功能性方法进行了比较.

深入了解不同的智能合约平台

图片来源:Docs.Microsoft.com

因此,让我们看一下功能性方法的优点:

  • 有助于创建高度保证的代码,因为更容易从数学上证明代码的行为方式.

  • 由于每个功能都旨在完成特定任务,因此提高了可读性和可维护性。这些功能也与状态无关.

  • 该代码更易于实现,并且代码中的任何更改也更易于实现。这使得迭代开发更容易.

  • 各个功能可以轻松隔离,从而使其更易于测试和调试.

深入了解不同的智能合约平台

Neo,以前称为Antshares,通常被称为“中国以太坊”.

根据他们的网站,Neo是一个“基于社区的非营利性区块链项目,利用区块链技术和数字身份对资产进行数字化,使用智能合约实现数字资产的自动化管理,并通过分布式实现“智能经济”网络。”

Neo的主要目标是成为“智能经济”的分布式网络。如他们的网站所述:

数字资产+数字身份+智能合约=智能经济.

Neo是由上海的区块链R开发的&D公司“ OnChain”。 Onchain由首席执行官Da Hongfei和首席技术官Erik Zhang创建。对Neo的研究始于2014年左右。2016年,Onchain被毕马威(KPMG)列为中国金融科技50强公司.

Neo希望创建一个智能合约平台,该平台具有以太坊虚拟机的所有优势,而又不会给开发人员造成语言障碍。在以太坊中,您将需要学习编写智能合约的技巧,而在Neo中,甚至可以使用Javascript来编写智能合约。.

Neo Smart Contract 2.0

Neo的智能合约系统(又称Smart Contract 2.0)包括三个部分:

  • NeoVM.
  • 互操作服务
  • 开发包

新病毒

这是Neo虚拟机的图形表示:

深入了解不同的智能合约平台

图片来源:Neo Whitepaper

正如《新白皮书》所述,NeoVM或Neo虚拟机是一种轻量级的通用VM,其体系结构与JVM和.NET Runtime非常相似。它类似于虚拟CPU,后者按顺序读取和执行合同中的指令,并根据指令操作,逻辑操作等功能执行过程控制。它用途广泛,启动速度快,是运行智能合约的绝佳环境.

互操作服务

InteropService增加了智能合约的效用。它允许合同在NeoVM外部访问数据,而不会影响系统的整体稳定性和效率。.

当前,可互操作的服务层提供了一些API,用于访问智能合约的链数据。它可以访问的数据是:

  • 阻止信息.
  • 交易信息
  • 合同信息.
  • 资产信息

…。其他.

它还为智能合约提供了存储空间.

开发包

DevPack包括高级语言编译器和IDE插件。由于NeoVM体系结构与JVM和.NET Runtime非常相似,因此它使合同可以用其他语言编码。可以想象,这大大减少了开发人员学习如何创建智能合约的时间.

超级账本面料

深入了解不同的智能合约平台

根据他们的网站,“超级账本是一种开源协作成果,旨在促进跨行业的区块链技术。这是由Linux基金会主办的全球合作,包括金融,银行,物联网,供应链,制造和技术领域的领导者。”

Hyperledger系列中最有趣的项目也许是IBM的Fabric。而不是单个区块链Fabric是开发具有模块化架构的基于区块链的解决方案的基础.

借助Fabric,区块链的不同组件(例如共识和会员服务)可以成为即插即用的工具。 Fabric旨在提供一个框架,企业可以利用该框架将自己的个人区块链网络组合在一起,该网络可以迅速扩展到每秒超过1,000笔交易.

深入了解不同的智能合约平台

什么是面料,它如何工作?该框架在Go中实现。它用于启用具有不同权限级别的联盟区块链。 Fabric严重依赖于称为Chaincode的智能合约系统,该网络的每个对等方都在Docker容器中运行.

为了编写Chaincode,必须精通以下四个功能:

  • PutState:创建新资产或更新现有资产.

  • GetState:检索资产.

  • GetHistoryForKey:检索更改历史记录.

  • DelState:“删除”资产.

以下是Chaincode的示例:

//定义智能合约结构

输入SmartContract结构{}

//定义具有4个属性的汽车结构.

键入Car struct {

创建字符串`json:"制作"`

模型字符串`json:"模型"`

颜色字符串`json:"颜色"`

所有者字符串`json:"所有者"`

}

/ *

*由于运行智能合约的应用程序请求而调用了Invoke方法 "Fabcar"

*调用应用程序还使用参数指定了要调用的特定智能合约功能

* /

func(s * SmartContract)调用(APIstub shim.ChaincodeStubInterface)sc.Response {

//检索请求的智能合约功能和参数

函数,args:= APIstub.GetFunctionAndParameters()

//路由到适当的处理函数以与分类帐进行适当交互

如果功能== "initLedger" {

返回s.initLedger(APIstub)

} else if function == "createCar" {

返回s.createCar(APIstub,args)

}

返回shim.Error("智能合约功能名称无效.")

}

func(s * SmartContract)initLedger(APIstub shim.ChaincodeStubInterface)sc.Response {

返回shim.Success([] byte("Ledger现在正在运行,成功!"))

}

//使用获取的参数将新车添加到数据库

func(s * SmartContract)createCar(APIstub shim.ChaincodeStubInterface,args [] string)sc.Response {

如果len(args)!= 5 {

返回shim.Error("参数数目不正确。期待5")

}

var car = Car {制造商:args [1],型号:args [2],颜色:args [3],所有者:args [4]}

carAsBytes,_:= json.Marshal(汽车)

APIstub.PutState(args [0],carAsBytes)

返回shim.Success(nil)

}

func main(){

//创建一个新的智能合约

错误:= shim.Start(new(SmartContract))

如果err!= nil {

fmt.Printf("创建新的智能合约时出错:%s", 呃)

}

}

结论

所以你有它。一些智能合约平台以及使它们与众不同的各种属性。至少目前还没有“万能的”。您将需要选择最适合Dapp所需功能的平台.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me