#Flow Cadanceの初见面
-
为什么会有Flow Cadance
Ethereum-Solidity虽然是一组不错的区块链-智能合约的开发组合,但它们也有严重的缺点:- Ethereum作为基于POW共识运行的区块链,tps只有30左右,效率低下;而且gas费用高昂,实在不适合中小用户在上面发行和使用数字资产。
- Solidity作为第一代图灵完备的智能合约语言,自创建之初就写出了无数的BUG,甚至因为The DAO的重入攻击事件导致了Ethereum的分叉。初学者如果不具备一定的经验,写出来的合约是非常容易出BUG的。
- Ethereum-Solidity的中央账本模型使得遍历用户所有资产是一种十分困难的操作,存在巨大的安全隐患(授权操作),也不符合去中心化的思想。
针对以上问题,CryptoKitties的开发公司就自己制作了基于新架构的区块链Flow,和上面运行的智能合约编写语言Cadance。
为了解决上述问题,Flow-Cadance相比Ethereum-Solidity创立了一些新的特点:- Flow使用POS共识来运行区块链,提高了区块链运行效率的同时,大大降低了使用区块链的gas费用。
- Cadance加入了面向资源的编程设计,提高了智能合约编程的安全性。
- Flow-Cadance在账户存储层面上,使用了全新的权限模型设计,从而确保数据的安全性,并使得用户真正拥有自己的数字资产。
Flow的区块链设计
-
四种节点
- 收集节点可提高效率
- 执行节点可实现速度和规模
- 验证者节点保证正确性
- 共识节点确保去中心化
-
区块链不可能三角
区块链不可能三角指的是,在区块链网络里,去中心化、高性能、高安全性这三个特点是不能同时提高的。如果提高了区块链的去中心化程度和安全性,那么性能必然下降;如果提高了区块链的去中心化程度和性能,那么安全性必然下降;如果提高了区块链性能和安全性,那么去中心化程度必然下降。
Flow并不“打破”或证伪这个不可能三角推论,而是绕过它。其诀窍就在于,让不同的节点扮演不同的角色,就可以为系统中每个部分选择正确的取舍。共识节点最容易遭受拜占庭攻击,就需要保证其安全性和去中心化。当然,这限制了它们的性能,但我们不要求共识节点完成任何计算量大的工作。 同时,Flow提高了执行节点的性能 ,以显著提高吞吐量。
对每一类节点,这个不可能三角推论都是适用的,但是合并后,系统每一部分的弱点都能为其他部分的优势所弥补。 -
POS共识机制
Flow作为一个使用POS共识机制的区块链,要求验证人节点锁定一定数量的FLOW代币作为保证金,这一过程被称为质押。质押避免了低成本的“女巫”攻击(也即一个人操纵多个节点,以形成对网络的不当影响),并作为绑定的保证金,一旦节点试图发起网络攻击,罚没保证金。
Flow每一年都为验证人节点提供FLOW总发行量的固定比例作为奖励,这部分奖励由新增发行 (通胀)和交易费(与增发合并称“总奖励”)两部分构成(当前计划设为每年总发行量的3.75%)。
** Flow Cadance账户存储模型**
Flow-Cadance中定义了四个级别的访问控制,这些级别指定可以在何处访问或调用声明。- pub/access(all)表示该声明在所有范围内都是可访问/可见的。
- access(account)表示该声明仅在定义该声明的整个帐户范围内可访问/可见。这意味着该帐户中的其他合同都可以访问它,
- access(contract)表示声明只能在定义它的合同范围内访问/可见。这意味着同一合同中定义的其他类型和功能可以访问它,但同一帐户中的其他合同不能访问。
- priv/access(self) 意味着声明仅在当前和内部范围内可访问/可见。
Cadance的智能合约设计
面向资源
contract BugCoin { mapping (address => uint) public balance; function mint(address receiver, uint amount) public { balance[receiver] += amount; } function send(address receiver, uint amount) public { balance[msg.sender] -= amount; // balance[receiver] += amount; } }
上述Solidity合约在编程过程中犯了一个致命的错误,从而导致了整个代币系统的崩溃。然而在solidity编译这个合约的过程中,编译器不会提示任何错误,因为这完全符合solidity的语法规则。
pub resource Vault: Provider, Receiver, Balance { // pub = publicly readable, internally writable pub var balance: UFix64 init(balance: UFix64) { self.balance = balance } pub fun withdraw(amount: UFix64): @Vault { self.balance = self.balance - amount return <-create Vault(balance: amount) } pub fun deposit(from: @Vault) { self.balance = self.balance + from.balance destroy from } }
然而在Cadance中这种代码从一开始就不会被编译。这是因为 Cadence 中同质化代币合约的代币持有量是通过严格的规则约束的资源模型来实现的。除非显式地使用destory销毁资源,否则编译器会检查出交易执行前后资源总量的差异并中断执行,从而防止危险错误的发生。
transaction { var temporaryVault: @ExampleToken.Vault prepare(...) { ... self.temporaryVault <- myVault.withdraw(amount: 10.0) } execute { ... // Type-check will not pass if temporaryVault is not explicitly used! receiverRef.deposit(from: <-self.temporaryVault) } post { ... } }
资源表
官方文档
Cadence 编程教学
Cadence 在线编程
flow 中文文档资源
fastflow教程
【活动预告】
12月22日晚20:00 纯白矩阵×Flow-Cadencehttps://live.bilibili.com/23053792
-
If you want to Convert EML files to Outlook MSG in Bulk, I advise you to download eSoftTools MSG to EML Converter Software. With this software, you can convert all information including To, C, Bcc, Subject, Date&time, and email attachments. This software provides you to maintain the folder structure of MSG files in the destination location, and it never changed the structure of MSG email formatting. They provide you free demo trial version without any charge.
Read more - Convert EML files to Outlook MSG in Bulk
-
For a simple and elegant Online Flower Delivery in Braybrook take a look at The Flower Shed. Their vast range of fresh arrangements and flowers lets you send wishes and love with ease. It doesn't matter if it's a birthday anniversary, a birthday or small gesture that will brighten the day of someone else Flower Shed has you covered. With their dependable delivery, be sure that your flowers will arrive in perfect condition and in time.