门罗 RPC Pay介绍

“直到现在,RPC-Pay还处于被人忽视和低估的位置,RPC-Pay支持即时、隐私性的微交易,是Monero宇宙中最小的隐形支付单位。”(2020.1.29)
头等仓APP下载

“直到现在,RPC-Pay还处于被人忽视和低估的位置,RPC-Pay支持即时、隐私性的微交易,是Monero宇宙中最小的隐形支付单位。”(2020.1.29)

为何要运行一个Monero公共节点?不仅花钱,还无利可图,至少无法直接获利。于是反复出现一个思考:如何去激励更多的节点。RPC-Pay具备这种激励机制,它使用Monero的挖矿哈希(仅仅是哈希)来支付任何启用RPC-Pay服务器(如Monero节点)的远程过程调用 (Remote Procedure Calls/RPCs) 费用。服务器接受哈希作为付款,获得收入,且由于Monero使用RandomX算法,服务器使用普通的CPU就能高效地计算出挖矿哈希。采用支付哈希取代支付门罗的方式,RPC-Pay不会给Monero网络增加负担,或者留下记录。有了RPC-Pay,挖矿哈希变成了Monero一种新的最小隐形支付单位。

RPC

在了解RPC-pay之前,我们先来了解RPC的广义概念。RPC是一个程序(客户端)从另一个程序(服务器)请求数据和计算的过程。服务器可以是互联网上的任意计算机。RPC请求类似于常规程序中的子程序调用,但在RPC中,子程序是在服务器上工作。专用的中间软件层处理网络通信,包括请求与响应。因此在程序员看来,它们之间可以无缝操作。这些年来,程序员已经采用了多种不同类型的接口软件来实现RPC(远程进程调用)。

现代的RPC接口软件家族使用JavaScript Object Notation(简称JSON)来组织消息。JSON是一种交换数据的标准文本格式。它依赖于名字值对和数据列表,用稳定、可扩展和人类可读的方式来定义消息。JSON编码是Monero RPC框架主要采用的语言。

对于Monero而言,已经在许多方面应用到了RPC。例如标准的Monero守护进程的monerod,包含了Monero的大部分功能。针对各种区块链相关的函数调用,增加RPC服务器端。以及与标准Monero安装一起交付的monero-wallet-rap程序,不仅是钱包功能端服务器,还是monerod服务器的客户端。Monero的RPC调用更像是一个与网页服务器通信的浏览器。采用POST方法发送数据,返回文本信息,通常是JSON格式。如果你对RPC消息的详细案例感兴趣,可以查看Example#1中如何使用Monero RPC调用。

挖矿哈希

Monero的Random工作量证明挖矿首先会执行一个伪随机数进程,这个进程其实是一个新交易、随机数、支付地址、前一区块数据的函数。执行这样一个随机进程对CPU来说轻而易举,但对ASIC而言难上加难。程序的输出将哈希成一个256位的数字。如果这个数字小于指定的阈值,则视为挖出一个新区块。

这个哈希过程有一个优点,在生成哈希之前支付地址就是指定好的,这样哈希就能专门指定给某个人。这个优点能让矿池用支付地址来哈希函数。在现实当中,很少有类似挖矿哈希这类概念。挖矿哈希是一个仅为目标地址所有者而创建的值,这个值只保留至挖出下一个区块(Monero的出块时间大约2分钟)。

而在RPC-Pay中,由RPC客户端自身或客户端的(更强大的)助手计算出哈希值,一旦计算出哈希值,就发送到客户端。每个发送出去的哈希都等同于付款。极小比例的哈希符合服务器的要求,也就是计算出一个足够小的数字来挖出一个区块。然后服务器一一计算所有的哈希值,当且仅当在Monero网络上接收和公布一个正确的挖矿哈希时,服务器才获得付款。

RPC-Pay

RPC-pay是添加到monerod和钱包中的一个新功能,它支持使用挖矿哈希支付RPC调用的费用。在启动monerod时通过命令行配置RPC-Pay。启动参数示例如Example#2所示。同样,CLI钱包中有一些能创建哈希和支付monerod的命令行,在Example#2也有展示。

在当前发布的Monero版本当中,有一个连接monerod命令行(可以直接输入到monerod控制台)的RPC,即rpc_payments。rpc_payments命令在客户端显示付费信息以及在控制台窗口显示余额。如果节点闲置6个月,它就会清除Credit余额。

RPC-Pay具有许多优点,它支持去中心化,许多人都想运行一个自我付费的服务器,也就是说愿意以成本价运行服务器的人很少。RPC支付还鼓励了一些钱包用户运行自己的节点,减少支出。这些优势增强了网络,并使网络进一步去中心化。

第二个优点是RPC-Pay具有隐私性,无需为共享信息做备份或保障安全而存入大额credit资金。用作付费的挖矿哈希是匿名形式,无法追踪到区块链上的所有权。而支付ID可以用来追溯和留存资金,但由于操作程序基于小额资金,因此可以经常更换或者停用支付ID。

还有一点也很重要,考虑目前monerod/wallet实现RPC-Pay的劣势。第一,会增加低算力客户端的负担,例如必须依赖电脑助手来运算哈希。第二,服务器的收入是不确定的,只有当客户端提供挖出一个区块的哈希,同时服务器的输入是连续的,与常规的哈希匹配得上,才能获得收入。第三,服务器的收入受限于Monero的挖矿计划(即货币发行计划),收入会逐渐降低。

RPC-Pay不仅仅是Monero进程支付给其他Monero进程,任何服务器都能通过RPC-Pay获得收入。官方Monero节点和钱包是开源软件,可以用它们来创建新的应用程序,或可以与monerod实例通信的应用。核心理念是服务器将自己的门罗地址给客户端,客户端用门罗地址创建Monero挖矿哈希,然后将这个挖矿哈希发送给服务器作为回报。Example#3中给出了RPC-Pay软件源代码示例。

Primo

Primo是一款新的RPC-Pay应用程序(repo.getmonero.org/selene/primo),是一个支持付费网站内容交付的协议和软件套件。Primo可以用隐形的哈希代替烦人的广告。如果访问primo网站的用户不想观看广告,可以选择计算Monero挖矿哈希值。

Primo有三个组件。第一个组件是网页服务器使用的primo-apache模块。网站所有者安装此模块并配置需要支付的内容和金额。网页服务器与monerod实例通信,monerod实例处理哈希支付事宜,并让正确的哈希值接收挖矿收入。第二个组件是primo-firefox扩展器。想要使用RPC-Pay的网站访问者会把primo-firefox扩展器加载到Firefox浏览器中。第三个组件是初始控制中心图形控制工具,Firefox用户用它来配置接收哪些网站付款。

Primo为网站所有者和访客提供了报酬,规避了广告,同时增强了网络。客户端提供哈希值,服务器使用这些哈希值形成一个完整挖矿流程。对Monero而言,矿工越多样化越好。Primo是一个展示RPC-Pay可行性的完美示例。

展望未来

最初,RPC-Pay是与Monero版本0.15一起发布的新版本。随着时间的推移,功能会一点一点增加,而且随着RPC-Pay的发展,它的应用也会跟着发展。Primo是第一个外部应用程序,为其他应用做了一个很好的示例。所有互联网上向客户端提供数据或运算的服务器,都是可以通过RPC-Pay获得收入的潜在用户。而且在Monero的0.15版的新RandomX PoW算法下,任何计算机都能高效地计算哈希,获取RPC-Pay收入。RPC-Pay的时机已经成熟,许多令人振奋的开发即将诞生。

入门指南

#1: Monero RPC示例

使用命令行工具curl (curl.haxx.se),将Monero RPC调用发送到自己的monerod实例或公共服务器。例如,你想知道Monero区块链中有多少区块,可以使用RPC命令get_block_count获取区块数。要从Monero World的公共服务器获取区块信息,请安装curl并在命令行上键入以下命令:

curl -X POST uwillrunanodesoon.moneroworld.com:18089/json_rpc -H 'Content-Type:application/json' --data "{/"jsonrpc/":/"2.0/",/"id/":/"0/",/"method/":/"get_block_count/"}"

你获得如下响应:

{ "id": "0", "jsonrpc": "2.0", "result": { "count": 2021560, "status": "OK", "untrusted": false } }

区块链的区块数为2,021,560。

如果你正在用标准配置运行monerod实例,你可以在同一台计算机上用以下类似的命令获得相同的信息:

curl -X POST 127.0.0.1:18081/json_rpc -H 'Content-Type:application/json' --data "{/"jsonrpc/":/"2.0/",/"id/":/"0/",/"method/":/"get_block_count/"}"

有关monerod RPC接口的更多信息,请参见

web.getmonero.org/resources/developer-guides/daemon-rpc.html.

有关钱包RPC接口的信息,请参见
web.getmonero.org/resources/developer.guides/wallet-rpc.html

#2:设置守护进程和钱包

要测试自己本地monerod守护进程与RPC-Pay的性能,请运行以下命令:

monerod --restricted-rpc --rpc-payment-address 4xxxxxx --rpc-payment-credits 250 --rpc-payment-difficulty 1000

支付地址是一个标准的Monero支付地址,当某个挖矿哈希真正挖出一个新区块时,该地址就能获得付款。rpc-payment-credits与payment-difficulty一起算出,这样客户端就能得知credit/difficulty的比值。你会更改那些示例来适应自己的需要,将给出250/1000 = 0.25学分每哈希。然后你可以在同一台电脑上运行钱包:

monero-wallet-cli

一旦CLI钱包启动,输入start_mining_for_rpc启动RPC-Pay。可以使用命令rpc_payment_info监视Credit。Credit目标值是钱包试图保持的Credit数。达到这个Credit额度后,应当停止采矿。你可以使用如下命令在CLI钱包中设置目标值:

set credits-target 50000

rpc付款的自动挖矿阈值是钱包挖矿的最小credit率。如果服务器给出了一个更低的比率,则钱包不再发送哈希值。你可以在CLI钱包按照以下命令设置阀值:

set auto-mine-for-rpc-payment-threshold 0.25

#3:编码示例

RPC-Pay的代码可以用C语言(或其他语言)编写,使用免费的数据库进行网络通信。下面的示例展示了用C语言编写的RPC-Pay数据是如何与使用curl的monerod实例通信的。与在Box 1中使用的文本接口属于同一curl家族。curl既是一个数据库又是一个命令行工具。下面的代码是Primo中call_monero()函数的简化版。原代码可查看:

repo.getmonero.org/selene/primo/blob/master/webserver/apache/mod_primo.c

/* Note! Simplified, without some initialization, error checks, and memory cleanup. */ static char *call_monero(const char *host, const char *postdata) { ... CURL *curl = curl_easy_init(); char url[1024]; snprintf(url, sizeof(url), "%s/json_rpc", host); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(postdata)); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writef); primo_writer_t writer_data = {calloc(1, 1), 0}; curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writer_data); struct curl_slist *list = NULL; list = curl_slist_append(list, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); int res = curl_easy_perform(curl); return writer_data.data

本文由 区块链资讯平台头等仓 作者:筋斗云 发表,其版权均为 区块链资讯平台头等仓 所有,文章内容系作者个人观点,不代表 区块链资讯平台头等仓 对观点赞同或支持。如需转载,请注明文章来源。
头等仓APP下载

发表评论