Interexchange Client Address Protocol, an IBAN-compatible system for referencing and transacting to client accounts aimed to streamline the process of transferring funds, worry-free between exchanges and, ultimately, making KYC and AML concerns a thing of the past.
ICAP 互换客户端地址协议,一种IBAN兼容系统,用于引用和处理客户帐户,旨在简化资金转移流程,在交易所之间无忧无虑,并最终使KYC和AML成为过去。
3 8 O 0 7 3 K Y G T W W Z N 0 F 2 W Z 0 R 8 P X 5 Z P P Z S X E 0 0
3 8 24 0 7 3 20 34 16 29 32 32 35 23 0 15 2 32 35 0 27 8 25 33 5 35 25 25 35 28 33 14 0 0
简介
imToken钱包转账的二维码扫描后信息为iban开头的一段字符串:
iban:XE86G29C8IV34UOJMYWHGDSGME33YKEC3QO?account=100&type=ETH
这种格式是ICAP: 互换客户端地址协议
定义的,有关ICAP协议的简介如下:以太坊有关ICAP的wiki:ICAP: Inter exchange Client Address Protocol
生成过程
比如在以太坊的wiki中,提到了一个例子:地址
0x00c5496aee77c1ba1f0854206a26dda82a81d6d8
对应的ICAP格式地址为XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS
。 (ps:wiki中的例子本来是错误的,我给修改了,但是也没看到审核的过程,直接修改成功了)步骤1:将地址转为36进制编码
将地址
0x00c5496aee77c1ba1f0854206a26dda82a81d6d8
看做是16进制编码的一个大数,把这个大数按照36进制编码输出并前补0到30个字符。 示例代码:输出的字符串为:
38O073KYGTWWZN0F2WZ0R8PX5ZPPZS
其实这也可以理解为base36编码的过程,编码对应的字符串范围为
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
。步骤2:计算校验位
1、 将36进制编码的字符串
38O073KYGTWWZN0F2WZ0R8PX5ZPPZS
前面补上XE00
(数字0不是字母O),其中00的位置就是需要填写校验位的位置。 2、 将补上的XE00
放到编码字符串的末尾(为啥不直接补在末尾?),此时字符串为38O073KYGTWWZN0F2WZ0R8PX5ZPPZSXE00
3、 对上面的字符串,取出每一位,按照0=0,1=1, ... 9=9,A=10,B=11 ... Z=35
的规则,将单个字符转换以后的结果拼接成一个新的字符串:结果字符串为:
38240732034162932323523015232350278253353525253528331400
4、 将上面的字符串看做是一个10进制的大数,除以97取余:38240732034162932323523015232350278253353525253528331400 % 97=25
取余结果为25 5、 校验位=(97 + 1) - 25=73 6、 将73转为2位的字符串替换开头的校验位位置,ICAP结果就是:XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS
java代码实现
代码实现参见:IBAN.java
代码优化
代码中取余的操作是不断截取字符串换成int值取余做的,换成java的BigInteger类进行取余操作效率会更高 这个类代码也不多,把修改后的代码复制到这里保存:
代码执行的log: