Near-sdk-as Contracts - 单例风格与功能包
Near-sdk-as Contracts - Singleton style vs Bag of functions
在汇编脚本中编写NEAR智能合约似乎有两种风格
- 像Meme Museum
这样的函数包
- 像Lottery这样的单例风格。
我想知道在什么情况下推荐一种风格而不是另一种风格。
什么时候应该用一个而不是另一个?每种款式的advantages/disadvantages是多少?
最大的区别在于合约的初始化。
函数包 (BoF)
对于第一种样式,通常在顶层声明一个持久化集合。每个文件中的所有顶级代码都放在一个函数中,一个启动函数调用每个。 Wasm 二进制格式允许指定启动函数,以便在任何时候实例化二进制文件(e.i。由运行时加载)在调用任何导出函数之前调用该函数。
对于持久集合,这意味着分配对象,但不需要从存储中获取数据,直到读取某些内容,包括集合的长度或大小。
单例
声明了合约的顶级实例。然后检查存储中的“STATE”键,其中包含实例的状态。如果存在,则读取存储并从存储中反序列化实例。然后合约的每个“方法”都是一个使用全局实例的导出函数,例如instance.method(...)
,将参数传递给方法。如果方法用 @mutateState
修饰,则实例在方法调用后写回存储。
使用哪个
Singleton 为合约提供了一个很好的接口,通常更容易理解。但是,由于您在每次方法调用时都从存储中读取数据,因此它可能会更昂贵。
BoF 的另一个优点是它更容易扩展,因为您可以从依赖项中导出更多功能。
不过,也可以将两者结合使用。
所以真的是任何对你有意义的东西。
在汇编脚本中编写NEAR智能合约似乎有两种风格
- 像Meme Museum 这样的函数包
- 像Lottery这样的单例风格。
我想知道在什么情况下推荐一种风格而不是另一种风格。
什么时候应该用一个而不是另一个?每种款式的advantages/disadvantages是多少?
最大的区别在于合约的初始化。
函数包 (BoF)
对于第一种样式,通常在顶层声明一个持久化集合。每个文件中的所有顶级代码都放在一个函数中,一个启动函数调用每个。 Wasm 二进制格式允许指定启动函数,以便在任何时候实例化二进制文件(e.i。由运行时加载)在调用任何导出函数之前调用该函数。
对于持久集合,这意味着分配对象,但不需要从存储中获取数据,直到读取某些内容,包括集合的长度或大小。
单例
声明了合约的顶级实例。然后检查存储中的“STATE”键,其中包含实例的状态。如果存在,则读取存储并从存储中反序列化实例。然后合约的每个“方法”都是一个使用全局实例的导出函数,例如instance.method(...)
,将参数传递给方法。如果方法用 @mutateState
修饰,则实例在方法调用后写回存储。
使用哪个
Singleton 为合约提供了一个很好的接口,通常更容易理解。但是,由于您在每次方法调用时都从存储中读取数据,因此它可能会更昂贵。
BoF 的另一个优点是它更容易扩展,因为您可以从依赖项中导出更多功能。
不过,也可以将两者结合使用。
所以真的是任何对你有意义的东西。