大神教你:如何防止意外的 RAM 消耗
最爱小仙炖
发表于 2022-11-17 15:14:04
109
0
0
& g, L& M# b2 Z+ f9 C& ]
概述
1.没有Token被偷窃; O- O4 ^" T5 e0 ]* u
0 B% i. g; J* M& U) g
2.正确执行的合约不容易受到攻击, C* G/ I. S; y: W: N. }. l
/ k7 {5 [& `! y8 A4 K2 Z2 ], y
3.治理流程可以修正与各方意图相悖的代码表现
0 F A8 [8 J) d% R% J, T
4.出块者-对于保护的措施只有缓解的选项是可行的0 K! p, [ ~: ]% j
5.长期的升级可以使默认的行为更加安全# o' U/ _( V1 Q
. q) g/ \4 z: T, k* g5 T \/ L
没有Token丢失
& t6 u2 w1 u: i( i
恶意合约利用了智能合约开发者和用户对开发中智能合约最佳实践的误解。这种攻击类似于估计破坏而不是盗窃,一旦EOS治理程序可以审查和纠正这种情况就对于相关方不会有长期损害。# b! A/ u" S+ B: x3 F
防止滥用的最佳实践: U6 i* b- B! t
) q' Y& e" ~! R) J1 b& f
希望每个用户都可以审查一下他们会与之交互的合约,或者交由信任的第三方代他们去审查合约。这意味着审查者应该谨慎地与使用通知功能的智能合约交互。例如消耗他们的CPU和RAM,发送Token到他们不信任的智能合约。0 N' ]- h6 T: c5 c- q: r6 y A2 K. C b
开发者以编程方式发送Token到一个不信任的第三方指定账号,应该通过一个没有可用RAM资源的账号中继传送。这既适用于中心化交易所处理用户提款,也适用于去中心化交易所通过智能合约操作。有几个可信任的中继合约可用。
% L! A5 k7 S, x1 x# m, |+ ]
许多钱包的开发者已经采取行动去提醒用户交易时可能会消耗RAM资源。( ]$ o; N7 p7 b
/ N1 Y; o2 O' G' C5 R1 B
通过治理程序释放消耗的RAM
6 N4 T/ E2 t/ Z+ y7 S; `0 {& x/ ]/ W
我认为代码的意图(【翻译】“代码的意图”即法律)正如用户和开发者所理解的那样,就应该被强制执行。如果一个恶意合约很明显的利用用户意图和代码实际效果之间的不匹配,那么当恶意合约的始作俑者和那些与之牵连的人进行争议仲裁时,BP们有权将恶意合约列入黑名单。7 ]: u9 r2 U9 R! m
如果仲裁发现代码的行为违背与代码有关联的各方的意图,那么当选的出块者可以更新代码,使结果与各方的原始意图尽可能的匹配。在这种情况下,代码将被更新以释放意外消耗的RAM资源,并且将来不会消耗RAM。
为什么这是EOSIO的一个功能?" }) g9 h S6 ~2 B% }( N
$ N. d; C; h) ]6 r# t4 a1 u
目前有很多针对这个功能导致RAM被滥用的案例。最基本的案例是想要接受用户资金存款的游戏合约。交易所将实施代码以处理来自代币合约的转账通知,然后将交易所的余额记入发送人。在这种情况下,交易所和存款用户可以合理地授权交易合约消费用户的RAM来存储他们的余额。交易所不一定要将用户的余额存储在他们自己的RAM中,因为当许多帐户向交易所发送微小余额可以启用不同的攻击。( f* f, m' t8 e, h! T% G. ^1 @
$ W6 @& X) W. A6 J7 t, h: Y
EOSIO有一个相关的功能,内联actions,允许合约作为当前交易的一部分调用另一个合约的代码。与action通知功能不同,内联actions仅限于分配生成内联actions的合约的资源。Action通知依靠着原始action所分配的资源权限。
( k! L( g* d+ W3 S; R
防止意外行为继续发生6 k5 [0 T: U" q+ P% x7 a5 o/ h3 ?8 ^
虽然现在的设计有很多正当用途,但我们认为现在代码的默认行为与用户和开发者的直觉思维相反运行。为了简化不太常见的使用案例,必须采取措施,防止滥用而导致正常使用更加复杂。 T! R/ ^, s% X! @ g& G) ?$ r6 k
. l1 Z0 }" E/ j# Z* ]+ d
接下来我们建议只有接收通知的一方才有权利消耗RAM。这样可以安全地将Token发送到任何合约而不必担心它会意外消耗。交易所能够安全的处理提款,无需在处理提款请求前去审查部署到用户账号的合约。$ L' S1 \1 n8 Y! w6 s' D
' @$ X6 a) T* Z% s7 z
在此提议下,现有合约必须获得直接授权才能消耗一些用户可用的RAM。在接受用户的存入之前,交易所合约将要求用户“开立账户以预留用于存储其余额的空间”。然后,传入的存入通知将简单地增加预先分配的RAM,而不是分配新的RAM。
d \/ d7 R3 v% t2 E' S Y9 _
提议升级路径7 K! ~8 I: X, j$ C9 D- w
我们正在准备一个仅限于出块者的升级,它将改变默认行为,以防止action通知的接收者(例如token转账通知)意外消耗发送者的RAM。如果所有的BP都采用这个升级,那么就不太需要滥用的缓解措施了。不幸的是,这个缓解措施可能会破坏有效合约,直到他们可以在action通知处理期间更新到不依赖用户账号上的RAM分配。
; e' u) h2 J2 h) l. @
幸运的是,升级合约以采用最新最佳实践的过程应该相对简单。
是否所有节点都采用这个仅限于出块者的升级将会是下一次公投的一部分。! S( O3 Z- o, g4 S: U
% Q9 a b' B7 u5 F$ ^
结论
+ @8 ?# D0 F2 L6 @! X8 Z9 B
EOSIO正在如当初设计的一般运行,当你正确使用它的时候,它就是安全的。我们相信,对于大多数的情况,我们可以更轻松地使用EOSIO,并与EOS社区合作开发最强大的整体解决方案。/ _! @4 L! \! B+ P4 K Y9 f4 g* U
+ Y, n% Q8 i+ w# Y8 t
=END=
成为第一个吐槽的人