所有文章
指南

Solana 多对多转账:钱包一一配对

配对钱包转账在 Solana 上怎么走:一行一笔交易,每笔 0.001 SOL,以及宁可跳过整行也不削减金额的 rent 规则。

7 分钟阅读 J Tools Editorial
近乎全黑的底上排着两列红点,左边每个点都由一条细直线连到右边恰好一个点

在 Solana 上一次性挪动大批付款有三种走法,这三种一直被人混作一谈。多发工具从一个钱包付给一份名单。归集工具把许多钱包收进一个。剩下的那种情况,前两者都表达不出来。

一笔多对多转账让每个发送方留着自己的收款方。钱包 7 付给钱包 7,第八个付给第八个,两者互不知情。

听着像细枝末节。实际上这是资金只有一个出处,和四十个彼此独立的出处之间的差别。

  • 一行就是一笔交易。这一行的发送钱包承担这一行的全部开销。
  • 平台费每笔转账 0.001 SOL,网络费 0.000005 SOL。
  • 从没持有过该代币的收款方,还要再加 0.00203928 SOL 的 rent 押金。
  • 过不了检查的行会被整行跳过,而不是把金额削下去。

批量转账的三种形态

多发工具是一对多。一个钱包,一份收款名单,一个付款方。空投要的就是这种形态。

批量归集工具是多对一。二十个钱包,一个目的地,跑完之后所有余额落在同一处。

多对多工具是第三种形态,也是唯一认得配对关系的一种。第一行有第一行的出处,第二行是另一个出处。没有公用资金池,行与行之间也不互相补位。

左边一个亮点像扇子一样散向十个点组成的一列,右边笔直的线把两列点一对一连起来

一行要花多少

在多对多转账里,一行上最多摆着三项开销,全部由这一行的发送钱包承担。没有公用的出资账户,所以一个连自己这行都盖不住的钱包,也不会向上一行借。网络那一项是每个签名 5000 lamport 的基础费,Solana 自家的手续费文档把这笔账算得很清楚。

项目SOL 模式代币模式
平台费0.001 SOL0.001 SOL
网络费0.000005 SOL0.000005 SOL
收款方的代币账户不涉及0.00203928 SOL,且仅当该收款方从未持有过这种代币

第三行值得看两遍,因为绊住人的正是它。把一个 SPL 代币发给一个从没碰过它的地址,等于新建一个账户来装它,而 Solana 要为这个账户收一笔 rent 押金。这笔押金大约是网络费的两百倍,是平台费的两倍。

一百个新收款方,这项就占到账单里的 0.204 SOL 左右,而同样条件下平台费停在 0.1。押金不会被销毁:它留在收款方的代币账户里,日后谁关掉这个账户就退给谁。

被跳过的行

多对多在签名之前会跑两道检查,两道都是把行拦下来,而不是改动它。

第一道是简单的算术。如果发送钱包盖不住自己的金额加手续费,再加上可能要开的代币账户,这一行就被打上标记,原样留着。不会有半截发出去的情况。

第二道更古怪,也值得弄明白,因为头一回看见它像个 bug。Solana 不允许留下一个余额大于零、却低于免 rent 门槛的账户。普通钱包的这个门槛是 0.00089088 SOL,出自 Solana 的账户文档里那条公式。

把账户彻底清空是允许的。在里面留下 0.0005 SOL 则不允许。把钱包推进这道缝里的行会被标成 rent dust,就那么留着不发。

一条横轴:零处有一个亮点,接着是两根竖条夹住的红色区间,里面有一个暗点,区间之外还有两个亮点

为什么不干脆把金额削一点

另一条路是把金额一点点削到装得下,那样更糟。数字是人自己填进去的。一个不吭声就发出另一个数字的工具,是往后再也对不上任何一张表的工具。

要么把余额整个发走,要么把金额降到剩余部分越过门槛。预览会提前说清哪几行受影响,工具也会在签任何字之前,用一次调用把所有目标账户查一遍。

一行一笔交易,为什么这点要紧

多对多把每一行都做成自己独立的交易,所以倒下的那行只倒它自己。换成把所有内容堆进一笔交易的批处理,第 30 行的错误会把前面 29 行一起带走。

这是有代价的:四十对就是四十个签名和四十笔平台费。换来的是一份可以逐行读的结果。想知道这些交易进得有多快,数字放在 Solana 优先费该给多少那一篇里。

什么时候多对多才是对的形态

轮换钱包是对大多数人最实在的答案。手上一批钱包带着不想再带着走的历史,用钱包批量生成器做一批新的,然后希望旧钱包 7 只给新钱包 7 打钱,别的都不动。

第二种是付款名单,付款方逐行变化。几个项目,几个金库,一张表。多发工具根本表达不了,因为它的出处正好只有一个。

第三种是快照之后的再分配,每个持有者由一个事先指派给他的钱包付款。分之前怎么读那份分布,写在如何解读代币持有者分布里。

名单要怎么备

多对多的第一趟先用两行跑。结果表会告诉你一行到底花了多少,连代币账户押金一起算进去,然后再去发两千行。

顺手也查一下收款方是不是已经持有这种代币。半数是老持有者的名单,押金那一项会直接砍掉一半,而在一百行的规模上,它就是整张账单里最大的一个数字。

开跑之前把哪个钱包付哪一行记下来。跑完之后再去还原这份对应关系,比现在听上去费劲,尤其当发送钱包是刚生成的、还没有可供辨认的历史时。

关于余额最后提一句:每个发送钱包里留的钱要比它那一行的金额多一点。掐着小数末位配的话,rent 检查会把那一行挪开,你得重新给它打钱,比一开始就留出富余更慢。

名单变大之后会变的事

十行的时候,上面这些还是舒服的道理。多对多跑到两千行,有两件事变成真正的工作,而且都发生在工具之外。

第一件是打钱。每个发送钱包在开跑前都得备好自己的金额加手续费,没有哪一行能替另一行垫上。这意味着要先跑一趟分发,通常从一个金库出,而且宁可留富余也别掐着算。

第二件是事后对账。四十行看看表就行。两千行会想把结果导出来,跟原始表逐行核对,因为被跳过的行在浏览器里根本不会出现:它们作为交易从未存在过。

还有一个不那么显眼的效果。如果名单里新收款方和老收款方混着,每行成本就不是恒定的,拿前十行算出来的平均值,会给出一个跟总数不像的数字。数一数有多少收款方要新开账户,只把这个数乘以 0.00203928 SOL。

常见问题

这跟把多发工具跑很多遍有什么不同?

多发工具每跑一次,出处正好只有一个。四十个出处就是四十次运行,外加四十次手工切换钱包。这里是一次运行,四十行。

失败的行会不会产生费用?

不会。没通过预检的行根本不签名,所以既没有网络费也没有平台费。

发送方和收款方可以重叠吗?

可以。同一个钱包能在某一行发出、在另一行收到。每一行各查各的。

为什么我的行被标成 rent dust?

因为发送钱包剩下的余额会落在零和 0.00089088 SOL 之间。把余额整个发走,或者把金额降下来。

只发代币的钱包也需要 SOL 吗?

需要。就算挪的是代币,网络费和平台费也是用 SOL 付的。

配对的数量有上限吗?

实际拦住你的是准备工作,不是工具本身:每个发送钱包都得事先备好钱。

一句话怎么定

如果表里有一列写着付款方,要的就是多对多这种形态。如果所有行都从同一个钱包出,那就用多发工具,付一次而不是四十次。要是少了一行,先看 rent 门槛,再去猜是不是出了 bug。关于这个门槛,租金不足怎么办那篇写得更细。

J
作者
J Tools Editorial

来自 J Tools 团队的文章。

查看 J Tools Editorial 发表的所有文章 →

相关文章