免责声明:一圈作为开放的资讯分享平台,所提供的所有资讯仅代表作者个人观点,与一圈平台立场无关,且不构成任何投资理财建议。
logo

学堂

Algorand 智能合约

这篇文章介绍了Algorand的智能合约的功能和它使用的Teal语言。

原文作者:

Haichao

翻译作者:

Aman Aman

Algorand Smart Contract (ASC)

Algorand 是一个金融平台。除了实现金融资产的发行和承载金融资产以外,让金融资产之间能够实现智能化的交换也是一个非常重要的功能。而实现该功能所需要的就是智能合约(ASC),即通过预先设计和实现好的逻辑来自动批准资产(代币)的交换。Algorand 上的智能合约的应用场景非常广泛,比如:

  • ASA 自动兑换: 为用户提供自动兑换 ASA 代币的功能,比如10个A币自动兑换出100个B币
  • 代理支付交易手续费: 由第三方来代理为用户支付交易所需的手续费,降低用户使用应用的门槛

TEAL 语言

Algorand 团队同时还设计了一种简单的脚本语言 TEAL,用来实现这种逻辑程序。TEAL 是一个基于堆栈的脚本语言,使用了一个经过精心挑选的指令集,其中包括了堆栈操作(比如 dup 和 pop),逻辑判断(比如 + – * /),签名和哈希运算(比如 sha256 和 ed25519verify)以及对交易和区块等信息的读取操作等。与大多数智能合约类似,TEAL 语言也会对一个逻辑程序的大小和花费进行限制。目前 TEAL 将程序的大小限制在1,000字节以内,将程序的花费限制在20,000以内。关于 TEAL 的更多信息请参考官方文档[2]

逻辑账户与逻辑签名

Algorand 的智能合约有两种使用模式:逻辑账户和逻辑签名。逻辑账户指的是一个由逻辑程序控制的账户。这种账户和普通账户一样可以存储 ALGO 和 ASA 资产,但不一样的是,从逻辑账户发出的交易并不是由个人帐户的签名来批准的,而是基于该账户对应的逻辑程序,由区块链来自行判断的。开发者可以通过编写一段逻辑程序,并对其进行编译来创建一个逻辑账户,该账户会包含一个逻辑账户的地址和一个对应的逻辑账户签名。用户可以向该逻辑账户地址存入代币,由逻辑程序来控制如何能够从中取出代币。(如下图所示)

逻辑签名指的是一个由逻辑程序来对交易进行校验的签名。该签名与普通账户的私钥签名类似,可以用来授权交易的执行。但不同的是,普通账户的签名可以用来授权从其对应的账户中发出的所有交易;而逻辑签名则是基于逻辑来判断交易的有效性,只有当逻辑正确时,才能批准交易。开发者可以通过编写一段逻辑程序,并使用私钥对该程序签名来生成一个对应的逻辑签名,然后将该签名公布出来,从而使得其他人可以自行使用逻辑签名来发送从该账户发出的交易。用户可以通过逻辑签名来授权交易,由逻辑程序来对交易进行授权。(如下图所示)

如何创建和使用逻辑账户

具体创建和使用逻辑账户的流程如下:

  • 先使用 TEAL 语言编写脚本实现逻辑
  • 使用工具对脚本进行编译,可以得到一个逻辑账户地址和逻辑签名
  • 从个人帐户或多签账户向该逻辑账户地址充值
  • 若是想从该账户中转出一些资产,则需要构造一笔使用该逻辑账户地址作为发送方的交易,并使用逻辑签名进行签名
  • 最后再将交易发送上链,区块链就会依据事先编写的脚本逻辑来判断这笔交易的合法性。

这里提供一个账户实现自动兑换 ASA 代币的功能作为示例。首先编写一个脚本,逻辑为:

  • 必须是一组有两笔交易的交易组,其中一笔交易使用该逻辑账户的地址作为发送方,交易数量为 X 个 ASA 代币
  • 交易组中的另一笔交易必须是给该账户发送 Y 个 ALGO 的交易

用 TEAL 脚本实现逻辑的代码如下(注意⚠️:这里为了方便省略许多其他的安全性判断,比如对交易手续费的判断等,在实际操作中需要注意,完整代码请参考文档[3]):

// 检查是否为只有两笔交易的交易组
global GroupSize
int 2
==
&&

// 检查该交易为交易组中的第一笔交易
txn GroupIndex
int 0
==

// 检查发送的交易的 ID
txn XferAsset
int ASSET_ID
==
&&

// 检查第一笔交易的接收者与第二笔交易的发送者是否相同
txn AssetReceiver
gtxn 1 Sender
==
&&

// 检查第一笔交易的 ALGO 代币数量
txn Amount
int Y
==
&&

// 检查第二笔交易的代币数量
gtxn 1 AssetAmount
int X
==
...

之后我们需要使用编译工具对上面的代币编译,可以得到一个 Base64 格式程序字符串和逻辑账户地址;接着就可以使用 SDK 来构造和发送交易。

这里使用 Java 语言的 SDK 作为示例(省去了组合交易的部分,具体可参考文档[4]):

// 读取程序脚本,并获得逻辑账户的签名的和地址
byte[] program = {"编译后的程序"};
LogicsigSignature lsig = new LogicsigSignature(program, null);

// 创建交易
Transaction tx = new Transaction(lsig.toAddress(), new Address(receiver-address<PLACEHOLDER>),BigInteger.valueOf(fee<PLACEHOLDER>), amount<PLACEHOLDER>, first-valid-round<PLACEHOLDER>, last-valid-round<PLACEHOLDER>, genesis-id<PLACEHOLDER>, genesis-hash<PLACEHOLDER>);
try {
 // 使用逻辑签名对交易进行签名
 SignedTransaction stx = Account.signLogicsigTransaction(lsig, tx);
 byte[] encodedTxBytes = Encoder.encodeToMsgPack(stx);
 // 发送交易,并获取交易签名
 TransactionID id = algodApiInstance.rawTransaction(encodedTxBytes);
} catch (ApiException e) {
 ...
}

如何创建和使用逻辑签名

具体创建和使用逻辑签名的流程如下:

  • 先使用 TEAL 语言编写脚本实现逻辑
  • 使用工具对脚本进行编译,并使用某个账户的私钥对程序签名,可以得到一个逻辑签名
  • 若是想从该账户中转出一些资产,则需要构造一笔使用该账户地址作为发送方的交易,并且使用逻辑签名对该交易进行签名
  • 最后再将交易发送上链,区块链就会依据事先编写的脚本逻辑来判断这笔交易的合法性。

使用逻辑签名也可以实现上述的例子。具体流程如下图所示:

逻辑账户和逻辑签名的区别

我们可以发现无论是使用逻辑账户还是逻辑签名,我们都可以实现类似的功能。但他们在使用模式上有一个区别:

  • 逻辑账户是一个第三方的账户,该账户有地址,但并不存在对应的公私钥对,从该账户发送交易的唯一办法是是经过其对应的逻辑程序的验证;
  • 逻辑签名是使用某一个普通账户(由某个公私钥对控制)的私钥对一个逻辑程序进行签名而生成的,该签名可以用来授权该账户发出的交易,除此以外该账户自己的公私钥对依然可以授权交易

非图灵完备

Algorand 的智能合约所使用的脚本 TEAL 属于非图灵完备的语言。 乍看之下好像缺失了一些功能,丧失了部分灵活性,但这一点完全是从产品角度出发考虑后所作出的决定。


图灵完备的合约拥有着最大程度的灵活性,但获得这些灵活性来自于对安全性和便利性的妥协。当开发者能够使用更多的函数和功能时,就意味着他们需要更多的代码才能实现一个简单的功能,这就增大了攻击面,降低了使用的便利性。同样是去中心化交易所中所必须的原子交易功能,Algorand 上原生自带,使用起来只需几行代码,安全性也更高;但在以太坊上则需要通过部署一个复杂的合约才能实现。就好比 Windows 和 MacOS 上的应用程序:一个可定制性更高,但不知什么时候就会中病毒的招;一个功能少但更简洁,满足需求的同时保证了安全性和便利性。未来 Algorand 还会针对开发者的需要来不断扩充功能,保证在安全和便利优先的条件下,满足所有去中心化应用的开发需求。同时还可以注意到 Algorand 将大部分的功能都放到了链下实现,只有需要验证,并且经过共识的信息才会发到链上。大部分的计算工作都不需要与链打交道,这就减轻了链的压力,同时也提升了开发的效率。代表状态的数据本身并不需要保存在链上,而只需要将状态对应的哈希保存即可;在需要调用状态时,可以将状态数据包含在交易里发送到链上,并由合约将数据与哈希进行对比,以此来保证数据的真实性和完整性。

参考资料


[1] 开发者文档:https://developer.algorand.org/docs/

[2] 官方文档:https://developer.algorand.org/docs/reference/teal/specification/

[3][4] 参考文档:https://developer.algorand.org/docs/features/asc1/goal_teal_walkthrough/

原文标题:

Algorand 智能合约

发表时间:

2020/04/26
火速分享
Share on facebook
Share on twitter
Share on linkedin

Leave a Reply

相关课程

热门标签

好久不见,甚是想念。快登录吧