大家都知道,Grin通过实现MW协议,试图打造更注重交易隐私性的数字货币。在比特币里,所有的数据都是公开的。你要给人转一笔钱,是通过确定对方的地址和交易金额,然后签署交易,并且把这笔交易广播到整个网络来创建交易的。
在 MW 协议里,交易数量被隐藏起来了,发送方和接收方则必须一起工作,在信息广播到网络之前先制定交易。而且,Grin的系统里是没有地址的,它通过CoinJion(简单点说,就是在UTXO里把把多个输入和多个输出合并成一个,这样就把很多人的转账信息合并隐藏起来了)的技术,还可以把很多中间交易信息删除——比如张三给李四转了一笔钱,李四又把这笔钱转给了王五,那么最后Grin会直接把李四的交易删除,只保留张三转给王五的交易记录。
这样有什么好处呢?一来是中间交易很难被追踪,隐私性更强;二来是需要保存的数据也变少了,这样节点变轻了,更多人加入进来当节点也就更容易了,于是更分布式了。
那么一个有意思的问题来了,既然没有地址,Grin是怎么转账的?
Grin在github上有一个如何使用钱包的wiki,基本包括了需要的信息,可以参考 https://github.com/mimblewimble/docs/wiki/How-to-use-the-Grin-wallet 。
这篇文章里我们来简单概括下现有的4种转账方法。
四种转账方式
通过Grin钱包转账,都是在自己机器上已经运行了一个Grin节点的前提下,使用命令行输入命令来完成的。
有两种转账方式:
1、实时转账:通过钱包监听的ip地址和端口
在命令行里输入
grin wallet send -c 0 -d http://<IP>:<PORT> 转账金额
就可以完成一笔转账。这个前提是你需要知道对方的钱包监听地址,就是上面命令里的这串信息:http://<IP>:<PORT>,并且双方的钱包都需要实时在线。
可能有人会问,那你用这个ip地址来转账,跟比特币的钱包地址有什么区别吗?我觉得一方面是你给这个IP地址转账,IP地址的信息是不会被记录到交易里去的,也没有人可以查到,除此之外,你可以在不同的ip地址,或者修改不同的端口来运行你的钱包,让钱包来监听转账事件(比如直接换台电脑、换个网络)。这个地址和端口都是可以修改的,也不跟你的钱包绑定在一起。
2、离线转账:通过传输文件
如果你不知道对方的钱包监听地址,或者对方没有在线,那你可以选择用文件的方式来转账。这种转账方式有点像是,你写了一份合同,然后把合同寄给某个人,对方确认过后签上自己的信息,再把合同寄回给你,你拿到合同后,交易就生效了。
类似双方都需要进行确认的特殊“支票”。
文件转账的好处是,文件的传输方式本身可以非常灵活,通过任何媒体、任何软件、任何渠道来传,同时支持离线进行。
更详细的原理是这样:
- 发起转账的人首先产生一个包含部分转账信息的文件,然后可以把这个文件以任何合适的方法发送给收款人,比如通过电子邮件、dropbox、pastebin、微信等等。
- 接收方收到这个文件,然后把自己的一部分信息添加到文件中来帮助完成交易。这一步又会生成一个文件,接收方再把这个文件返回给发送方。
- 发送方接收到收款人发回的这个文件,确认交易完成。这笔交易也会通过节点自动广播到网络里。
文件里会包含公钥信息,如果泄露出去可能会影响交易涉及到的金额,但不会泄露任何私钥信息。
上面的每个步骤都可以使用命令行完成:
# 1. Generates <filename> to send 10 grins
grin wallet send -m file -d <filename> 10
# Send <filename> to the receiver
#2. Receiver adds their information, generates <filename>.response to provide to the sender
grin wallet receive -i <filename>
# 3. Sender finalizes the transaction, which gets broadcasted
grin wallet finalize -i <filename>.response
当然,这种方式的坏处也很明显。还是比较蛋疼,两个文件要互相传来传去,对用惯了比特币的人来说,还是不那么方便的。
3、钱包插件工具
上面两种转账方式既然都这么麻烦,Grin又是个社区化的货币,肯定会有开发者来做更好用的钱包插件的。
我特意在github上搜了下,找到一个项目叫 wallet713 ,是一个开源的Grin钱包插件,不知道跟Grin官方有没有直接关系。
wallet713也是要求你在本地运行一个Grin节点,但相比于原生钱包,它自己实现了一些优化,虽然也是基于命令行来操作的。
wallet713的原理是通过713.grinbox来做一层relay,通过公私钥来确认你的身份,确保其他人无法查看你的交易。你的ip地址连接到这层relay上进行转账,你的公钥就是你的地址。然后713.grinbox本身不会存储任何数据。
它有这么几个好处:
- 钱包的监听、转账、收款、原子交换都可以在同一个命令行窗口里完成。如果你用过原生钱包就会知道,经常需要开不同的命令行窗口,一个用来监听,一个用来转账,等等。
- 通过713.grinbox可以直接用一串公钥地址转账给对方,不需要自己处理ip地址、端口转发、文件传输什么的。
- 支持离线。只要通过713wallet发送了交易,即使对方不在线也不要紧。等到对方再次上线的时候就能接收到交易信息。
- 可以有自己的通讯录。如果你把对方的地址添加到本地,备注一个名字,以后就可以直接通过名字来发送交易了,类似这样: send 10 --to @alice
wallet713目前还在开发中,应该会跟随Grin主网一起上线。我还没有试用过,不知道具体安全性和易用性如何,感兴趣的朋友可以自己探索。
4、不用命令行的界面工具
我在github上还找到了一个工具,是一个用Angular写的Grin钱包的web UI,叫 grin-web-wallet 。
grin-web-wallet 还是需要你在本地运行一个节点。启动原生钱包监听,然后打开浏览器查看 http://localhost:4200 ,就可以看到可视化的钱包界面。
对小白用户来说,用浏览器进行转账会更方便直观一些,毕竟习惯用命令行工具的人还是少数。不过这个工具还没来得及实测,不知道能不能work。
(完)