译自 halo2 book:concepts/gadgets.md
小工具
在实现一个电路时,我们本可以直接使用我们所选芯片(chips)的特性。不过,通常我们会通过***小工具(gadgets)***来使用它们。这种间接层是有用的,因为出于效率原因以及 PLONKish 电路所施加的限制,芯片接口往往会依赖于底层的实现细节。小工具接口可以提供一个更便利、更稳定的 API,把那些无关紧要的细节抽象掉。
例如,考虑一个像 SHA-256 这样的哈希函数。一个支持 SHA-256 的芯片的接口可能依赖于该哈希函数设计的内部细节,比如消息调度(message schedule)与压缩函数(compression function)之间的划分。相应的小工具接口可以提供一个更便利、更熟悉的 update/finalize API,并且还可以处理哈希函数中不需要芯片支持的部分,比如填充(padding)。这类似于 CPU 上密码学原语的加速指令通常是通过软件库来访问,而不是直接访问。
小工具还可以为更高层级的电路编程提供模块化、可复用的抽象,类似于它们在 libsnark 和 bellman 等库中的用法。除了抽象函数之外,它们还可以抽象类型,比如椭圆曲线点(elliptic curve points)或特定大小的整数。