共识算法(Consensus Algorithm)是保证区块链可信度和安全性的重要技术。目前,有多种主流的共识算法,如工作量证明(Proof of Work, PoW)、权益证明(Proof of Stake, PoS)等等,各有其优、缺点与适用对象。在区块链技术领域,不可小觑共识算法的重要地位。
我们与Algorand合作,共同为大家带来的硬核分享“深度解析共识算法”系列活动目前已进行到第三讲。在本期分享中,Algorand基金会Associate Director朱海潮,为诸位Hacker讲解Algorand平台开发实践。
Algorand 这个名字既代表了一个创新的共识算法,也代表了一个基于该共识算法实现的公链平台。在前面的课程中我们已经学习了共识算法相关的所有内容。如果你确实完全跟着学习了前两个讲座的话,那么你对于共识算法的理解应该已经高于99%的小伙伴了。没来得及的朋友和可以去看看前两次讲座的整理文章。
今天我们会讲解在 Algorand 平台上开发是怎样一种体验。一般想要入门一个新的区块链平台,只需要搞懂四个概念就可以了:区块,交易,地址(也叫钱包或账户),以及该平台上的自定义资产(即 ASA,Algorand Standard Asset)。
今天的讲座我们就按照这个顺序来介绍。
区块
Algorand 区块链使用 Algorand 共识算法进行区块和交易数据的共识。
在 Algorand 区块链浏览器中查看的时候可以发现,有时候区块高度使用轮次(Round)这个词来表示的。
这是因为在 Algorand 中,每一轮共识算法的流程结束之后都会产出一个块,即一个共识轮次对应一个区块。
这就意味着,Algorand 区块链在共识过程中不会产生分叉,同时每个区块中的交易都可以在一个区块内被立即被确认,而并不是像以太坊一样需要等待十几个区块才能确认交易。
目前 Algorand 主网上的区块确认时间约为4秒,也就是说一笔交易4秒即可实现最终确认(Finality)。
交易
交易的类型有三类:(1)ALGO 交易:用于发送 ALGO 代币(2)ASA 交易:用于创建,发送和配置 ASA 资产(3)参与共识交易:用于注册地址从而参与到共识当中。
这三类交易都使用了相同的交易体结构,在构造交易时可以选择不同的交易类型,并填写对应的交易信息。
创建交易和交易签名的过程都可以离线完成,签名之后的交易可以被发送到节点处进行验证和广播。
交易的 ID 是离线生成的,在构造完交易并签名后就可以立即获得交易 ID;而不是像以太坊一样需要等待节点返回交易 ID。
这里的好处是可以避免交易 ID 重复的交易被多次执行,同时也不需要使用类似以太坊中的 nonce 的机制,免去了钱包等客户端管理和记录 nonce 的工作。
原子交易
除此以外,Algorand 还原生支持原子交易功能。
当你希望几笔交易能够同时进行时,就可以使用原子交易的功能。
该功能允许你将几笔交易组合在一起,变成一笔交易。只有当这笔组合后的交易被其中所包含的所有交易的发送方都签名之后,该交易才能被确认。
如下图所示:
该功能可以使用 SDK 轻松实现,下面使用 Python SDK 做一个示例:
这里的逻辑也非常简单:当多方进行交易时,为了实现所有交易的原子性(即要么都成功上链,要么都失败),只需要把几笔交易收集起来,计算一个组交易 ID 出来,然后再让所有人带着这个 ID 去签名自己的交易,就算是确认允许自己的交易在这一组交易中合法了;之后只需要把所有签过名的交易打包发送上链,就可以实现这一组交易的原子交易的功能了。
轻松加愉快。
地址
Algorand 上的地址有三种:(1)个人账户地址(2)多签账户地址(3)逻辑账户地址
个人账户地址就是普通的钱包地址,有私钥作为密码,地址本身由公钥生成。当需要从该地址发送交易出去时,则需要使用对应的私钥对交易进行签名,才能在区块链上认证通过。
多签账户地址
多签账户地址是由多个个人账户地址组成的地址。用户可以通过使用 SDK 将多个地址组合成一个多签地址,并指定至少需要其中 n 个地址的签名才能解锁该地址。
比如可以将三个地址组合成一个多签地址,并指定解锁地址数为2,即当有其中两个地址的私钥对交易签名后,该交易就可以使用该多签地址中的资产。
用 Javascript 的 SDK 实现时会是这么一种体验:
是不是简单到爆?这都归功于 Algorand 在密码学上的独特优势,这才能为开发者们提供真正互联网时代的开发体验。
逻辑账户地址
逻辑账户指的是一个由程序控制的账户。这种账户和普通账户一样可以存储 ALGO 和 ASA 资产,但不一样的是,从逻辑账户发出的交易并不是通过签名来实现的,而是使用该账户对应的逻辑程序来判断的。
这里的逻辑程序就是 Algorand 上的智能合约 ASC1 (Algorand Smart Contract) 了。Algorand 团队设计了一种简单的脚本语言 TEAL 来实现这种逻辑程序。
在具体使用时,我们先使用 TEAL 语言编写脚本实现逻辑,然后再使用工具对脚本进行编译,就可以得到一个逻辑账户地址和一个逻辑签名;我们可以正常从一般账户向该逻辑账户地址充值;若是想从该账户中转出一些资产,则需要使用该逻辑账户地址作为发送方,再使用其逻辑签名对交易进行签名;最后再将交易发送上链,区块链就会依据事先编写的脚本逻辑来判断这笔交易的合法性。
使用这个功能,再加上之前提到的原子交换,我们就可以实现很多的功能了。这里提供一个账户实现自动兑换 ASA 代币的功能作为示例。
首先编写一个脚本,逻辑为:
· 必须是一组有两笔交易的交易组,其中一笔交易使用该逻辑账户的地址作为发送方,交易数量为 X 个 ASA 代币
· 交易组中的另一笔交易必须是给该账户发送 Y 个 ALGO 的交易
用 TEAL 脚本实现逻辑的代码如下(注意:这里为了方便省略许多其他的安全性判断,比如对交易手续费的判断等,在实际操作中需要注意,完整代码请参考文档:https://developer.algorand.org/):
之后我们需要使用编译工具对上面的代币编译,可以得到一个 Base64 格式程序字符串和逻辑账户地址;接着就可以使用 SDK 来构造和发送交易。
这里使用 Java 语言的 SDK 作为示例(省去了组合交易的部分,具体可参考文档:https://developer.algorand.org/):
地址最小余额
关于账户,有一个在区块链设计中必须注意的问题,那就是防止地址的滥用。
在区块链上每一个地址的都将占用网络中节点的存储空间,若是允许用户无成本的在链上创造地址,那么将会使存储的占用大大增加,从而增加节点的负担,降低网络的去中心化程度。
以太坊上防止类似问题的机制是提供奖励,当用户主动发送交易销毁一个地址时可以获得一些 Gas 的奖励。
但在实际中这种方法显然并不奏效。2017 年的 ICO 泡沫产生了大量的无用合约和地址,大量的占用了存储空间,使得节点负担剧增。目前若是想要同步一个以太坊存档节点,已经需要至少 3T 的硬盘空间,并且必须是 IO 速度在 5,000 以上的 SSD 才可以。
Algorand 在这个问题上的解决方案是直接增加创建地址的成本。Algorand 上的地址是有最小余额的。每个普通的 Algorand 地址都需要持有最少 0.1 个 ALGO;当地址持有 ASA 资产时,每持有一种 ASA 资产,该最小余额增加 0.1 ALGO。
若一笔交易试图将某个账户地址上的 ALGO 数量减少到少于最小余额,那么该交易将不合法。
如果想要提取所有剩余 ALGO 并注销地址,可以使用交易中的 CloseTo 参数来实现,具体方法可以参考文档:https://developer.algorand.org/。
ASA
Algorand 上的自定义资产 ASA 是由原生功能实现的,而不是像以太坊上的 ERC20 那样通过部署合约实现。
创建资产,设置资产信息,冻结资产,发送资产等这些功能都可以通过发送原生的交易实现,而不需要去调用任何的自定义合约。
SDK 中也有对应的功能,这里用 GO 语言的 SDK 做一个示例,在链上创建一个 ASA 资产:
需要注意的是,每个地址在接收 ASA 资产之前,都必须要进行一次注册(Opt-In),即通过向自己发送一笔数量为0的该 ASA 资产的交易,来告诉区块链,自己已经准备好接收这种资产了。
这种设计主要是为了未来合规做打算:Algorand 作为一个金融平台,上面会发行各种合规的金融资产。而大部分合规资产都会要求发行人和出售方对于购买方实行 KYC 制度。这就意味只有一个账户经过一种 ASA 资产的 KYC 之后,它才有资格去接收这种资产。
Algorand 的这种设计,原生保障了链上 KYC 的可行性,将无国界金融(Borderless Economy)这个口号用代码落实在了实际设计中。
用 SDK 实现 ASA 地址注册的方法如下:
接下来就是发送 ASA 资产。过程与发送原生资产 ALGO 一模一样,只需要调用一个 SDK 函数构造一笔交易,填写好参数,再签名发送即可。
除此以外,Algorand 还提供了 ASA 的冻结和销毁等功能,具体的细节可以参考参考文档:https://developer.algorand.org/。
写在最后
也许大家会注意到:Algorand 目前并没有提供所谓图灵完备的智能合约功能给开发者。这一点完全是从产品角度出发考虑后所作出的决定。
图灵完备的合约拥有着最大程度的灵活性,但获得这些灵活性来自于对安全性和便利性的妥协。当开发者能够使用更多的函数和功能时,就意味着他们需要更多的代码才能实现一个简单的功能,这就增大了攻击面,降低了使用的便利性。
同样是去中心化交易所中所必须的原子交易功能,Algorand 上原生自带,使用起来只需几行代码,安全性也更高;但在以太坊上则需要通过部署一个复杂的合约才能实现。
就好比 Windows 和 MacOS 上的应用程序:一个可定制性更高,但不知什么时候就会中病毒的招,各类弹窗广告也层出不穷;一个功能少但更简洁,满足需求的同时保证了安全性和便利性。
未来 Algorand 还会针对开发者的需要来不断扩充功能,保证在安全和便利优先的条件下,满足所有去中心化应用的开发需求。
同时还可以注意到 Algorand 将大部分的功能都放到了链下实现,只有需要验证,并且经过共识的信息才会发到链上。大部分的计算工作都不需要与链打交道,这就减轻了链的压力,同时也提升了开发的效率。
除此以外,同样是为了方便开发者,Algorand 提供了命令行工具 goal 和 Javascript,Java,Python,GO 四种语言的 SDK 来协助各位进行开发。
实际上如果细心观察的话,就可以发现今天讲座里的代码示例我就用了四种开发语言分别展示。更多的工具可以参考开发者文档:https://developer.algorand.org/。
总而言之,Algorand 致力于将开发门槛降到最低的这份心意,希望大家都能通过今天的这个讲座确实的接收到。
讲座的最后再布置一个作业,希望大家回去之后都能在 Algorand 上去发行一个属于自己的 ASA 代币。前十名发行成功并提供地址给我们的同学,我们将给予 100 ALGO 的奖励。想了解更多详情,请访问下方Github地址
https://gist.github.com/Mine77/23e513462ad55f9da2888996e4deeae5
去吧,Algorand 的大航海时代开始了!世界上的一切都放在那里,想要的话就去拿吧!
本文地址: https://www.xiguacaijing.com/news/baike/2020/19462.html
赞助商