在我以前的文章中曾经说过区块链的操作可以粗暴地分为两大类:读操作&写操作。所谓的读操作就是从区块链获取信息,所谓的写操作就是对区块链进行操作将信息写入到区块链。
(图源 :pixabay)
现在看起来,这样的总结可能有些肤浅,不过对我熟悉的几个链而言,也差不太多。对了,请叫我差不多先生。
说到读操作,对于YOYOW而言,使用API从主网上获取区块、获取账户信息、获取主网信息、获取交易信息等,这些都是读炒作;而使用钱包进行转账、投票、更新授权、收取积分等等这些就是写操作啦。
今天要学的是摒弃钱包,直接使用API进行写操作,以及使用API在网络上广播交易。
为什么要摒弃钱包软件呢?因为钱包软件对系统有一定的依赖性,比如我在树莓派(ARM架构)下尝试加载命令行钱包,就会出现如下错误:
-bash: ./yoyow_client: cannot execute binary file: Exec format error
而使用API则只要联网就可以啦,不受钱包软件执行格式的限制,无论是树莓派、Windows,都可以执行。
(另外一种做法是开放钱包API,然后在其它设备或者其它网络中通过HTTP/HTTPS访问这个API,实现广播交易等写操作,但是总感觉这样增加复杂性且不安全)
那么具体要如何在YOYOW上广播交易呢?也就是说如何进行写操作呢?两年多前,针对HIVE/STEEM区块链,我进行过如下总结:
- 设置我们要进行的操作(operations)
- 将操作放到事务中(transaction)
- 设置事务的TaPos信息(ref_block_)
- 设置事务的超时时间(expiration)
- 序列化事务(serialize)
- 用chain_id和序列化后的事务来生成摘要(digest)
- 对摘要进行签名(sign)并附加到事务中
- 广播事务(broadcast)
简单解释一下,操作就是我们要做的事情,比如说转账。用Python话,我们要弄一个字典结构,然后设置对应的信息;事务就是操作的集合体,一个事务中可以有0个、1个或者多个操作。
TaPos信息就是通过ref_block_num以及ref_block_prefix指向之前已经存在的一个块与hash来防止重播攻击等。
超时时间(expiration)更好理解,就是这个交易如果没在这个时间点之前被包含到区块中,它就会被丢弃。
最难的部分就是序列化事务(serialize),我承认我一直搞不定这块。不过这里有个投机取巧的做法,回头我再细说。
生成摘要这个是为了对事务进行签名,也就是说对事务进行签名其实就是对摘要进行签名。至于chain_id,不同的链有不同的chain_id,所以A链上的事务是没法广播到B链的。
签名就是使用私钥对摘要进行签名,然后把签名附着到事务中,这样区块链处理这条事务的时候,就可以判断是否是合法的事务了。比如说我从A账户转账10000YOYO到B账户,那么只有我用A账户的资金私钥进行了正确的签名,才能被区块链认可。
做完上述工作,就可以把事务广播到主网中,如果一切正常,那么事务就会被包含到区块链中,对应的操作就会被执行,那么写操作就算完成了。
(图源 :pixabay)
噫,这么一看,要做的事情还不少呢,我有点打退堂鼓了,唉,有这时间去喝酒撸串多好呀。哦,不对,我戒酒了,还是好好学习比较好。