1. 首页 > 创业 > 求职

a16z对话Move语言之父:从编程语言说起,为何Move是未来智能合约的重要方向

主持人 Sonal Chokshi:我们谈到了优化gas,类型、资产和安全性。还有哪些限制是需要考虑的?

Sui CTO Sam Blackshear :这是一个类似于gas的线程,但我想到的具体子集是状态。这对我来说是一个大问题。当我考虑gas操作时,我喜欢进行极端的gas优化。

但是,当我们处理持有真实资金的实际智能合约时,我的一般建议是,除非你可以费尽心思地使用略少于之前使用的状态,否则你应该做出合理的组织。那是唯一一次我会使用大型汇编块的情况,如果你可以做出一些愚蠢的事情来使用更少的状态,因为这就像一个永远的资源,我们应该将它放在仅高于执行或调用数据的位置。

a16z Eddy Lazzarin:我完全同意这个观点,因为我认为这是根本性的昂贵的问题。如果一个平台允许每个合约都触及任何一块状态,那么它将很难实现并行化。而像 Squeeze 以及其他一些新的区块链平台所采用的方法是,显式地限定交易可以访问的状态,至少让我知道一些。这样在高层面上平台就能够更容易地将交易实现并行化,包括执行和共识。因此,这是一些程序员必须思考的问题:在访问状态时尽可能地快,不要触及不需要的状态,这样验证者才能更有效地实现并行化,实现更多的区块空间。

a16z Noah:这是否会打开一种世界,即即使在非角色扮演的情况下,不是所有验证者都需要下载全部状态?如果你能很容易地将状态分离开来,让验证者仅服务于它能处理的事务,这是否可以实现?

Sui CTO Sam Blackshear :我认为这确实有可能实现这样的世界。这也为不同的方法开辟了一条道路。让我回顾一下,从程序员的角度来看,能够跨不同的交易触及整个世界是非常有价值的。但是,我们不能过于强调这个优点,以至于必须通过 Rollup 或者跨多个交易来实现,因为这会降低安全性,让用户注意到。我认为区块链的价值来自于这样的抽象:有一个账本,所有有价值的状态都在这个账本上,我可以一次性触及它们。从程序员的角度来看,这是区块链的价值所在。问题在于:如何在幕后让事情更有效地进行?如何让它变得更加稀疏,使得验证者可以更有效地进行并行化?在Sui 中,一个验证者可以有多个工作人员,每个工作人员负责一部分状态。但从程序员的角度、甚至从其他验证者的角度来看,它看起来就像是一个逻辑实体,它可以完成一切工作。这使得存储、执行都变得更容易,而不必将这些东西编码到协议级别,并让用户和程序员来考虑。

4、智能合约编程思维方式上的改变

主持人 Sonal Chokshi:我们刚才讨论了一些与智能合约编程相关的独特之处。还有哪些思维方式上的改变?我们已经谈到了一些,像Eddie提到的,一个巨大的转变是,在编程的世界中,至少自从计算机的早期,我们处于丰富的世界,但在这个世界中,我们处于限制的世界。那是一个思维方式的例子。还有哪些思维方式的转变?特别是对于你们每个人来说,作为你们接触智能合约编程的程序员,有什么让你们感到惊讶,或者教会了你们,或者让你们对某些事情有了不同的看法?

a16z Eddy Lazzarin:也许一个有点傻的例子是,我还记得几年前我第一次学到ERC-20代币的余额不是你的账户拥有的东西。你的地址没有代币余额。代替它的是,有一个代币合约,记录着哪个地址有多少余额。当你想要向某人转移代币时,你不是发送给他们一些代币。相反,你需要到合约中进行所有这些低级别的操作,改变你的地址和他们的地址所持有的余额。你有权限操作和改变那个合约。这是一种非常反直觉的方式,在 EVM 和 Slippery 中这是第一次让我注意到的关于Move的一个有趣的思维方式转变。这是有趣的思维方式转变,因为我们经常听到的英文单词不一定与编程模型相对应。

Sui CTO Sam Blackshear :我想要补充一点,这与你在实际操作时有关。在正常的世界中,我们非常关注开发人员的生产力,因为工程师的工作是编写大量代码,让这些代码只有几个错误,并且这些错误不会太严重。而在智能合约世界中,你的工作是编写非常少量的代码,而且必须完美无缺。它必须在所有可能的方面都是完美的。否则,你将失去数亿其他人的钱。这是一种完全不同的思维方式的转变。花费两个月的时间盯着1000行代码,并尝试想出如何使其更好、更重要的是,如何使其完美,然后审核人员也要做同样的工作,判断它是否完美。

主持人 Sonal Chokshi:这是一个大的思维转变。在编程的世界里,至少自计算机的早期以来,我们一直处于丰富的世界,但在这个世界中,我们处于一个约束的世界。

a16z Eddy Lazzarin:另一个思维转变是,在ERC 20代币的世界里,你的地址没有代币余额。你不能发送代币,你必须去访问代币合约,在代币合约中查找地址对应的代币余额,然后通过修改地址和余额来完成代币转移。这是一种比较反直觉的思考方式,但在EVM和Move中,这是非常重要的思维转变。

Sui CTO Sam Blackshear :在智能合约编程中,你的工作是编写一小段代码,并且必须是完美的,因为这个代码可能涉及到数亿人的资金安全。你必须仔细审查代码,确保代码的正确性。另外,升级智能合约的难度比升级移动应用或网站更高,因为在智能合约中,代码是不可变的。在智能合约编程中,你必须考虑如何支持安全的升级和信任,使其看起来更像传统生态系统。但是智能合约编程中,你需要拥有一个对抗性的思维方式,这对于来自其他领域的人可能很陌生。这是因为在智能合约中的部署模型,你不仅需要考虑你的应用的预期使用情况,还要考虑非预期的使用情况。因为在传统编程中,有方法可以隐藏自己,限制为一个小型 API,或使用防火墙来限制攻击者的操作等。但智能合约的整个意义在于,你所做的可以与你从未想象过的代码进行交互,并且可以安全地实现。因此,你需要考虑这种情况下的优点和缺点。这绝对是相对于传统编程的一个思维方式的转变。

主持人 Sonal Chokshi:这是一个非常重要的问题,也是我们讨论如何编写智能合约和使用智能合约编程语言时应该优先考虑的问题吗?

Sui CTO Sam Blackshear :是的,绝对是。这实际上是我最喜欢谈论的事情。这让我非常害怕,智能合约语言设计者需要考虑的问题是安全性。这是主要焦点,甚至可能是唯一的焦点,直到我们解决了这个问题。我认为,智能合约安全对于更广泛的加密货币采用来说是一种存在性威胁。我这么说的原因是,您可以看一下以太坊和solidity,以及最流行的平台EVM和Solidity。您可以看看编写此代码的早期程序员,他们非常高素质,真正理解底层区块链,非常注重安全。他们知道自己在做什么。我认为,他们非常认真地编写管理数亿美元和数十亿美元的代码的责任。但是,如果您看一下任何地方的智能合约安全记录,都非常糟糕,这不是这些人的错。我认为这是一个非常困难的问题。并且我认为语言使其更加困难。所以,如果您看看我最喜欢的网站rakt.news,您可以查看排行榜或查看价值数千万或数亿美元的这十个黑客,这些黑客非常惯常,每周或每月发生一次,具体取决于规模。同时,智能合约开发者社区非常小,只有约5000名全职 EVM程序员,这与传统开发者社区相比非常非常小。因此,如果您相信我们拥有的人是最硬核且最注重安全的人员,但开发实践和安全记录是不可持续的,那么我认为您的结论是,没有任何方式可以使这个空间在没有使安全问题变得更糟的情况下继续增长,这可能意味着它根本不会增长,或者像那些想进入Web3的大型金融机构或公司一样,他们正在看着自己是否必须雇用智能合约开发者?我会被黑客攻击数千万美元并感到紧张。随着时间的推移,这种情况只会变得更糟。他们可能会保持观望。因此,作为试图设计新智能合约语言的人,安全性必须是您首先要考虑的事情。

主持人 Sonal Chokshi:你们其实已经在不失去资产的背景下暗示了这一点,但是你们更具体地是什么意思呢,因为它非常重要?Sui CTO Sam Blackshear :我所说的安全性是指我们既要防止程序员自我脚踏,还要尽可能为他们提供正确的原语,以便他们能够防御攻击,因为智能合约是一个设置,您的代码部署在一个攻击者旁边,攻击者可以直接调用您的代码,可以直接与其链接。您的代码是开源的,或者至少字节码是开源的。这是目前我们所见过的最具对抗性的编程环境,出错的代价也是最高的。因此,我认为如果你在讨论智能合约编程设计,那么安全性必须始终放在首位。一旦我们解决了安全问题,我们可以考虑其他更具表现力的因素,但这是我的有些乏味,但我认为非常重要的答案。

a16z Eddy Lazzarin:哪些特性能够影响安全性?有什么例子能够体现这一点呢?

Sui CTO Sam Blackshear :我认为最重要的是封装,具体来说,是封装的各个子特性。当您编写代码时,您无法预测攻击者会尝试什么,因此需要能够在没有预见到攻击者会做什么的情况下进行推理。所以,您需要一个强大的类型系统,不仅在源代码级别,而且在字节码级别都需要,这样您在编写源代码时获得的保证将在您将代码发布到区块链上、其他人依赖它并与它进行交互时继续保持。我们观察到,在其他领域中流行的某些特性在智能合约编程中本质上是不适合的,比如动态分派。在传统的编程中,像接口和动态分派这样的东西是关键的抽象机制,是无处不在的。您可以定义一个接口,然后其他人使用不同的逻辑重写该接口,然后您可以针对该接口进行编程,一切都非常好。但是我们有一个俏皮的说法:“在代码是法律的世界里,接口是犯罪行为。”

a16z Noah:这是个玩笑话,让我们停下来一分钟。在代码是法律的世界里,接口是犯罪行为。

主持人 Sonal Chokshi:在您继续之前,您能否再解释一下这句话?我不想太快地跳过它。

Sui CTO Sam Blackshear :是的,完全正确。这里的想法是,接口不定义行为,它定义了预期行为。比如,当你阅读接口的规范、参数名称甚至类型时,它告诉你想要完成什么。但是并不能保证它就一定会发生。

所以,如果你编写的代码是用来保护某些东西的,但实际上你留下了一个空白支票供攻击者、其他人填写。这在契约法中似乎是一种犯罪。这是一个未明确规定的合同。我非常喜欢这个特性,它在传统的编程语言中很受欢迎。但我们认为,在智能合约中,这导致了许多不同的问题。例如,重新进入需要动态调度。例如,如果您取消了动态调度,则根本没有重新进入。像以太坊中的毒药代币这样的事情发生了,因为您重写了转移函数,而每个人都知道直观地说,它只是用来转移资金,也许不会做其他任何事情。但现在你让它做一些超出预期的事情,比如窃取钱财。这就是一个特性的例子,如果将其删除,那么对代码进行推理并进行适当的封装就变得更加容易了,因为每次看到一个调用点时,您都知道它将确切地做什么,您不必担心其他人以后会做出令您惊讶的事情。

a16z Eddy Lazzarin:确切地说,我认为这个类比就像如果你定义一个关于椅子的接口,它有四条腿和一个座位,你描述的是它的具体层面,而不是行为层面,你没有描述可能是隐含或默认的关于椅子的其他事情,比如它具有某种结构完整性,它有特定的材料,它是以某种方式放置的。

a16z Eddy Lazzarin:可能被规避,这意味着接口只是一组任意的描述,不能捕捉您想要强制执行的安全约束。

a16z Noah:这正是定义。a16z Eddy Lazzarin:在错误的层面定义事物。我很好奇。

Sui CTO Sam Blackshear :但是,您如何在接口之外很好地进行模块化?如果接口是一种犯罪,我可能是一个罪犯,因为我的最喜欢构建复杂的智能合约的方式之一是喜欢有不同的合约,具有不同的目的。而且,特别是在非常复杂的系统中,您有一个基于模块的基础,其中模块遵守某种接口,然后主要合同可以知道如何调用不同的模块。这些模块通常通过治理方式获得许可,如何获得超级表达的即插即用的模块性?没有标准化接口?如何获得继承?

a16z Eddy Lazzarin:这些与接口有关的所有事情都喜欢吗?

Sui CTO Sam Blackshear :这正是要问的正确问题。他们可以整天反对这一点,但是如何提供一些使您编写有用代码的东西?就像如果不允许您走出房子之类的事情一样,没有犯罪。但是我们做到这一点的方式是,接口和继承并不是唯一的方式,我倾向于以组合为思考方式。我们提供了几种组合原语,不需要动态调度程序接口。其中之一是泛型。我们有运行时遗传,看起来很像您所拥有的。Clr(Sui World注:common language runtime,公共语言运行库)让我给出一个非常具体的例子,否则这很快就会变得抽象。像您的ERC-20之类的东西,这显然是一项根本重要的加密标准。如果您的平台,您的语言无法做到这一点,那么它将没有什么用处。

在像 Move 这样的语言中,您定义了一个称为t的类型点,其中t是一个泛型类型参数,然后实现了coin的函数,例如有一个函数用于将2个点连接在一起。这适用于所有coin类型。这不是某个人想要覆盖的东西。您定义拆分。当你想让某人定制代币的行为时,使用所谓的能力模式,例如对于代币,你可能想要定制的一件事情是总供应量是多少,或者更根本的是它的政策是什么?你可以这样表达:好的,你有类型为“t”的点结构体,然后有不同的t的实例化,例如美元、英镑或其他的货币类型。对于你想要定制的东西,你在能力层面上提供它,创建一个代币的函数。

 3/6   首页 上一页 1 2 3 4 5 6 下一页 尾页

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.longfuchaju.com//chuangye/qiuzhi/6604.html

联系我们

在线咨询:点击这里给我发消息

微信号:wx123456