永恒之链:用微信在区块链上刻字项目技术详解

2016-06-20 16:05 来源:巴比特 阅读:5200
上周,我用自己做测试的微信公众号【lawup2003】做了一个区块链刻字服务,而且是免费的,每个关注该公众号的用户都有三次机会将一段不超过40个字节的内容永久刻在比特币的区块链上。一经发布,立即引来业内外很多同仁的围观。

上周,我用自己做测试的微信公众号【lawup2003】做了一个区块链刻字服务,而且是免费的,每个关注该公众号的用户都有三次机会将一段不超过40个字节的内容永久刻在比特币的区块链上。一经发布,立即引来业内外很多同仁的围观。(服务器6月22日到期,不准备再续费了,将不再提供刻字服务,但之前在区块链上刻的内容,将会永久存在,这段时间所有的刻字内容都在这个地址交易的OP_RETURN中:https://blockchain.info/address/1MGP1ZNBkxpcgLf2zF6WK48Nd8owfkoEFU  我要去学习研究以太坊等新事物去了!事实上,您可以按照此文,也能做出一个一模一样的区块链刻字服务来!

 

前一周才给我们授过课的申屠青春老师体验了项目后评价:“很不错的想法啊!很强的执行能力呢!”

 

该项目在区块链微信讨论群中发布后,一些群友纷纷点赞,红包打赏络绎不绝,有群友表示:“谢谢你的努力!让我对区块链有了直观的感受!”

 

小蚁CEO达鸿飞也认为:“这个应用挺有意思的,简化了使用区块链的门槛。”当然,他同时也提醒:“目前,这个还不适合做商业项目”,因为“太简单啦,没壁垒!”

 

的 确,“达叔”作为商业大佬,眼光很准。不过,这几天来,当我给询问技术细节的群友逐一耐心解释的时候,发现每个人对区块链的认识和技术能力其实都是参差不 齐的,如何让区块链技术爱好者特别是那些刚入门却面对一堆密密麻麻的文档无从下手的初学者一个指引,也许是我这个小小的实验性项目该为中国区块链事业做出 的一点贡献。特别是,还有位同学提到了,他觉得用微信来对接区块链大大地增强了易用性,降低了用户对陌生事物的恐惧心理,所以他准备在我这个项目的基础上 做课堂考勤等创新应用。

 

于是,废话少说,就让我们来解剖这只小“麻雀”吧!初学者跟着我一步一步,你也能架起一个一模一样的微信刻字服务。

第一步:学会用比特币的脚本刻字

注意,默认看这篇文章的,都跟作者一样是初学者,所以就以windows平台为演示截图,至于你用linux或者Mac的,那证明你已经不是初学者或者已经具备一定的技术水平了,请自行切换(其实也不影响)。

 

1、下载安装Bitcoin Core客户端,运行bitcoin-qt(有UI的客户端)并同步所有区块(现在的区块体积已经达到75G了,所以你需要一个足够大的硬盘);

 

2、同步完成后,在客户端的顶部次行菜单点【请求付款】,进入后点【请求付款】,系统会为你创建一个比特币钱包地址,把你的比特币钱包地址复制下来;

 

3、你需要到交易市场去买点比特币(因为挖矿对于初学者是另一个新的大问题,所以直接买吧,当然,也不要买多,买0.01个比特币,约合人民币30块钱的,就足够我们项目用很久的了),然后提币到你刚才复制的那个地址,那个你的比特币钱包的地址;

 

4、提的币到账后,你将看到客户端上你的可使用余额将不再为0,此时,在客户端顶部的菜单依次点【帮助→调试窗口→控制台】打开输入脚本操作的地方,按照如下步骤操作:

 

(1)键入如下内容并回车( 1MGP1ZNBkxpcgLf2zF6WK48Nd8owfkoEFU是我的比特币钱包地址,操作时请换成你的地址):

listunspent 0 100 ‘["1MGP1ZNBkxpcgLf2zF6WK48Nd8owfkoEFU"]‘

得到交易ID(txid),如下图:

本步骤是查看本钱包尚未花费的金额,amount后面就是现有比特币的金额,当然,这里主要是想得到交易ID(txid),还有vout后面这个数字也记下,以便完成后面的步骤;

 

(2) 找一个能把字符串转化为十六进制(STR2HEX)的在线网站,把你要写进区块链的话进行编码,例如我要把“Code is Law”这句话给写进区块链,HEX之后得到的是“436f6465206973204c6177”,掐指一算,不超过40个字符,可以继续(我们这次要 刻入外带数据的地方,一般来说不能超过40个字符,也有突破这个长度限制的,另说);

 

(3)回到比特币客户端的【控制台】,键入如下内容并回车:

createrawtransaction ‘[{"txid":"70c66f61ab38482f4193ea78cee68a54685382b04a46d2ee68f6467ca392b1fb","vout":0}]‘ ‘{“1LUpUZ5bTTczJa1BGx5DBm6Mo6V8vnjPtz”:0.0001,”1MGP1ZNBkxpcgLf2zF6WK48Nd8owfkoEFU”:0.01378807,”data”:”436f6465206973204c6177″}’

这段脚本是要创建一个交易(我们将通过比特币交易,将之前我们要写入区块链的那句话作为交易的备注项,刻到区块链上):

注意:

 

①交易ID(txid)要用之前我们查询尚未花费金额时得到的;

 

②vout是指你比特币客户端上该地址是钱包里面的第几个,我这里是0,表示是最新地址,如果你前面也按照我说的做,没有创建更多的地址,也应该是0;

 

③ 后面第一段地址和金额,表示交易接受款项的地址和金额,因为我们的目的是刻字,所以我只转少量的(0.0001个比特币,这已经是“尘金额”了,如果再少 就有可能无法被比特币网络确认了)到我另外一个比特币钱包地址里(理论上说,是可以填写与发送钱包相同的钱包地址的,但是在客户端里面,可能是为了避免显 而易见的“错误”,所以不允许这样输入脚本命令,但是我们后面用RPC实现的时候,我同一个账户直接自转自,就是可以的了;如果你没有第二个比特币钱包, 你可以通过前面的方法,再生产一个收款地址,把那个地址设置成脚本中的收款地址,不过,得注意的是,注意你的发送地址的vout就会变成1了,因为那个新 生成的地址会是最新的,它的vout将是0);

 

④ 后面第二段地址和金额,是找零地址和金额(关于找零地址和比特币交易的运行机制,请自行学习,这里不讲),找零地址和金额可以不指定,如果不指定,系统将 在你的钱包里自动生成新的地址用于找零,而金额将是扣除了默认手续费之后的金额(默认手续费在客户端【发送】界面的左下角可以看到)。比特币之所以要新生 成地址用于找零,主要是为了保护转账人的隐私,不过也给新手带来了不便,系统中,每发送一次没有指定找零地址的交易,系统就会使用掉一个找零地址,而每 100个地址使用后,就会集体丢弃,再同批生成100个新地址,而如果你用前一批地址中的某个作为收款地址,则在新的100个地址生成之后接收的款项将无 法使用。所以,为避免麻烦,我建议这里最好把找零地址也设定成自己的这个钱包地址。当然,这会面临一个新问题,找零地址后面的金额如何填写,公式就是:尚 未花费的金额-自转自的金额-交易费,所以这里就是: 0.01398807–0.0001–0.0001= 0.01378807;

 

⑤data项里面就填写之前得到的要刻入区块链那句话HEX之后的字符串;

得到了很长一串,复制它,接下来要用;

 

(4)键入如下内容并回车:

signrawtransaction 后面加上上一步得到的那一大长串

这里,我们是给之前创建的交易进行了签名(用你独一无二的比特币钱包的私钥进行签名),得到的hex就是签名之后的结果,complete为true表示签名成功!把hex复制下来,后面接着会使用;

 

(5)键入如下内容并回车:

sendrawtransaction 后面加上那一大长串签名之后的hex

这里就是把交易发送即广播出去了,得到的结果是这笔交易的ID,复制这个交易ID;

 

5、交易的广播执行是瞬间完成的,确认同步则有可能需要10-30分钟(RP问题,哈哈),不过这不影响到一些提供区块链信息查询的网站上去查看这笔交易,例如我们打开:

https://blockchain.info/tx/8d2933db168aaead7e654b4d76805c2de933584242f6c6d5bd1589e7d0517ae4

网址的后面部分就是我们之前得到的交易ID,移到页面底部,OP_RETURN项就是我们刻入的外带数据了(有些查询网站默认不显示脚本,得点一下【显示脚本】或【Show Scripts】才能看到):

截图如下:

第二步:学会配合比特币RPC并用bitcoin-cli操作

 

1、配置比特币PRC

 

(1)关掉bitcoin-qt (关的时候要小心,关了之后要多等个几秒钟,以免出现不可预知的错误,导致好不容易同步完的区块链损坏,要重新同步);

 

(2) 进入C:\Users\用户名\AppData\Roaming\Bitcoin文件夹(这是你bitcion安装后默认的配置文件的文件夹,在安装了 bitcoin程序或者首次运行bitcoin程序之后自动生成),建立一个新文件bitcoin.conf,在里面添加如下内容(括号及括号中是说明, 不要写到文件里):

rpcuser=123456 (请修改123456为你的RPC用户名)

rpcpassword=123456 (请修改123456为你的RPC密码)

rpcport=8338  (RPC端口,默认是8332,但是我在windows下可能是安装了别的软件导致8332端口不能用,所以换成8338了)

rpcallowip=127.0.0.1 (为安全考虑,RPC只允许本机连接)

rpcconnect=127.0.0.1 (为安全考虑,只连本地节点)

注意上述内容纯文本格式,一行一段,结尾没有分号或其它符号,直接换行。

 

(3)打开【命令提示符】

在终端中先进入bitcoin安装目录下面的deamon文件夹,例如我的是【C:\Bitcoin\daemon】,输入bitcoind -server 回车

因为我们没有指定别的参数,所以,如果没报错,那么bitcoind就是在运行的啦!保持这个【命令提示符】窗口一直开着,不要关闭它,因为一关闭,bitcoind就关闭了。

 

(4)另外开一个【命令提示符】

同样在终端中先进入bitcoin安装目录下面的deamon文件夹,例如我输入的是cd c:\bitcoin\daemon

     输入:bitcoin-cli -rpcuser=123456 -rpcuserpassword=123456 getinfo 回车后结果如下:

这里返回的是账户的情况概览;

测试bitcoin-cli是正常的,那么跟之前在bitcoin-qt的【控制台】里面的操作就是一样的了,唯一的不同就是两点:

一是前面要加上 bitcoin-cli ;

二是要注意引号转义,JSON里面的引号都要加上反斜杠转义。

好,那么我们试试createrawtransaction语句,键入如下内容,回车:

bitcoin-cli createrawtransaction “[{\"txid\":\"8d2933db168aaead7e654b4d76805c2de933584242f6c6d5bd1589e7d0517ae4\",\"vout\":0}]” “{\”1LUpUZ5bTTczJa1BGx5DBm6Mo6V8vnjPtz\”:0.0001}”

顺利得到执行结果。

那么,接下来就省略了,只是换了个地方输入命令,执行结果都将是一样的,照着前面的步骤做就好啦!

第三步:用php或python或其它语言调用RPC操作

 

在 wiki上面( https://en.bitcoin.it/wiki/API_reference_(JSON-RPC) ),发现有很多种语言都可以调用bitcoin的PRC,从而使得可以在你的现有程序中完成在比特币区块链上刻字的操作。当然,我们不用重新去发明轮子 了,因为当中有太多的细节要注意,前面我们已经知道了基础原理,现在我们要奉行实用主义啦(如果不懂基础原理,后面有些需要个性化的地方就不知道怎么改, 所以基础原理也是必须的),如果你懂得php或者python,就可以站在前人的肩膀上去用实现刻字功能。

 

1、 到github上面找到php-OP_RETURN(这个是php的,你如果用python,也可以找到python-OP_RETURN,作者都是 coinspark,用法几乎是一样的),把php-OP_RETURN部署到你的php运行目录中(在windows上可以用phpstudy一键搭建 php环境);

 

2、修改OP_RETURN.php文件,把rpc信息配置好:

 

3、同目录下创建一个php文件(例如run.php),里面放上如下代码(也是照着readme里面来的):

然后在浏览器中运行该文件 http://127.0.0.1/run.php 将得到交易的ID(前面那么复杂的过程,这么简单就完成了,不懂原理会以为很简单吧,哈哈),跟我们之前一样,把交易ID带到blockchain.info等网站查看,在最下面OP_RETURN中就看到你刻入的内容了。

注意,这里我可以用同一个钱包地址自己发送给自己,成功了,说明只是在bitcoin-qt里面有限制,实际上在底层是可以的自转自的。

 

4、 之前提到过,发送交易100次后自动更换一批新的地址,那么,如果用原始的php-OP_RETURN代码,会自动生成找零地址,当达到100次,再自转 自的币就收不到了(因为旧的地址属于已经被丢弃的100个地址,新收到的币因缺少这个地址对应的密钥,将再无法使用出去,虽然数量很少,但也是钱呀,无意 义的烧钱咱不干),所以,我们要把php-OP_RETURN原始代码中生成新地址的那段注释掉,然后把creatrawtransaction中的找零 地址变成自己(自己找零自己,“在线钱包”服务之所以能一直使用一个地址,无论是否超过100次发送交易都不变,原理跟这一样),打开 OP_RETURN.php文件,修改这两处:

当 然,你也可以有另外的一些思路,比如先通过rpc计算出新地址,然后把金额减掉交易费全部发送到新地址,从而实现0找零,这也是个思路,不过这可能会遇到 问题:当前面一次刻字交易尚未得到确认的时候,紧接着进行下一次交易,可能会被当成“双花”而不成功,因为自转自的币还没得到足够的确认嘛。当然,这个思 路可以再完善,我写这一段的目的是想表达,如果你觉得我这个方法不算好,也可以打开思路,构建更好的流程,以便系统自动运行,更少的人工投入。

 

5、现在再运行http://127.0.0.1/run.php ,就实现了自转自、自找零的交易了,这种交易在blockchain.info上面显示是这样的:

 

6、当然,最关键的,补充一下,OP_RETURN就通过php程序(或者python或其他程序)刻到bitcoin的区块链上去了,这也就实现了通过网站web刻字了。

第四步:把功能与微信开发者模式对接

 

我们这里主要讲bitcoin和blockchain,所以如果要想深入了解微信公众号的开发者模式的各种功能,可以搜【方倍工作室】,那里有关于微信开发者模式的任何东西。

 

注册并登录微信公众号的后台,在【自动回复】中关闭编辑模式,然后去【基本配置】中开启开发者模式,根据【开发者工具→开发者文档】的规范在你的服务器上建立一个php网络文件,将该网址放到【服务器配置】中:

通过这个网络文件,实现接收微信用户发来的消息,判断其类型,获得其内容,然后根据类型和内容,自动给予回复。这也就是微信用户发来消息,然后微信公众号把刻好字的交易地址回复给用户的基本流程啦!

 

这 里还要说个特殊考虑,笔者的bitcoin是部署运行在阿里云上,且rpc配置只允许127.0.0.1本机调用,所以笔者在阿里云的这台机器上搭建了 php环境,然后用一个特殊的端口接收和反馈结果;而运行微信开发者模式的php程序实际是在SAE新浪云上,只有在SAE上面的php程序知道调用 bitcoin的rpc的主机和端口,同时两者之间通讯还需要一个简单的认证,说白了,就是中间多加了一层,这么做,目的有两个:一个是确保 bitcoin网络运行与微信公众号的网络运行互不影响,例如bitcoin占资源较多时,不至于出现微信公众号用户发了内容半天没有回复的情况;当然, 其实第二个原因才是重点,那就是,除了SAE这个程序里面,谁也不知道我的bitcoin运行的主机是地址,这便能较好地保护我的比特币的安全(虽然没多 少,但也是钱呀)!因为我听说偷比特币的黑客很厉害的,咱是初学者,除了冷钱包备份,还没掌握比特币热钱包的安全技巧呢!所以只有尽量让自己藏起来,不露 脸就不会挨打,这个好像是《三体》里的“黑暗森林法则”吧,哈哈~

 

那么,来实际感受一下这个微信小作品吧,扫描二维码关注【lawup2003】(6月22日之前有效):

话 说,我在文章开头说了,跟着我一步步来,你也可以做出一个一模一样的微信,所以我将毫无保留提供我能提供的一切(即便我其实是个文科生,代码写的很糟糕, 数据库的设定也不是很科学,但也不怕献丑了):我把微信开发者模式绑定的网络文件及mysql数据库文件打包访到百度云上面了,需要的朋友请自己下载。需 要注意的是,微信配置文件和与阿里云主机通讯的地方,无论如何要大家自己根据需要改了(我在每个需要改的行后面都备注了“//修改”,你可以通过搜索快速 找到),因为我相信对于看懂了这篇文章的同学来说,这几个地方补充上,一点也不难。

 

就这样啦!微信开发者模式php文件和数据库文件的下载地址是:

http://pan.baidu.com/s/1mhWlDsG

 

最后,如果大家觉得项目不错,或者有任何想法、疑问和吐槽,可以加笔者微信Lawup2 谢谢~


声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文