- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正尝试通过 json-rpc
发布到本地比特币全节点,但我从服务器收到错误消息。
按照此处的文档: https://bitcoincore.org/en/doc/0.17.0/rpc/rawtransactions/createrawtransaction/
我可以看到以下用于 createrawtransaction
请求的示例结构:
{"jsonrpc": "1.0", "id":"curltest", "method": "createrawtransaction", "params": ["[{\"txid\":\"myid\",\"vout\":0}]", "[{\"address\":0.01}]"] }
我的代码创建了以下结构,似乎与 bitcoincore.org 示例的结构相匹配:
{"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":["[{\"txid\":\"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26\",\"vout\":1}]","[{\"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj\":0.01}]"]}
但是报错:
System.Net.WebException
HResult=0x80131509
Message=The remote server returned an error: (500) Internal Server Error.
Source=RawTransactions
StackTrace:
at RawTransactions.Form1.RequestServer(String methodName, List`1 parameters) in C:\Users\userthree\Documents\Visual Studio 2017\Projects\RawTransactions\RawTransactions\Form1.cs:line 132
at RawTransactions.Form1.button1_Click(Object sender, EventArgs e) in C:\Users\userthree\Documents\Visual Studio 2017\Projects\RawTransactions\RawTransactions\Form1.cs:line 77
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at RawTransactions.Program.Main() in C:\Users\userthree\Documents\Visual Studio 2017\Projects\RawTransactions\RawTransactions\Program.cs:line 19
下面是我用来发出 RPC 请求的方法,我从此处的 API 引用中获得:
https://en.bitcoin.it/wiki/API_reference_(JSON-RPC)#.NET_.28C.23.29
public static string RequestServer(string methodName, List<string> parameters)
{
string ServerIp = "http://localhost:18332";
string UserName = "USERNAME";
string Password = "PASSWORD";
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(ServerIp);
webRequest.Credentials = new NetworkCredential(UserName, Password);
webRequest.ContentType = "application/json-rpc";
webRequest.Method = "POST";
string respVal = string.Empty;
JObject joe = new JObject();
joe.Add(new JProperty("jsonrpc", "1.0"));
joe.Add(new JProperty("id", "1"));
joe.Add(new JProperty("method", methodName));
JArray props = new JArray();
foreach (var parameter in parameters)
{
props.Add(parameter);
}
joe.Add(new JProperty("params", props));
// serialize json for the request
string s = JsonConvert.SerializeObject(joe);
byte[] byteArray = Encoding.UTF8.GetBytes(s);
webRequest.ContentLength = byteArray.Length;
Stream dataStream = webRequest.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
StreamReader streamReader = null;
try
{
WebResponse webResponse = webRequest.GetResponse();
streamReader = new StreamReader(webResponse.GetResponseStream(), true);
respVal = streamReader.ReadToEnd();
var data = JsonConvert.DeserializeObject(respVal).ToString();
return data;
}
catch (Exception exp)
{
throw (exp);
}
finally
{
if (streamReader != null)
{
streamReader.Close();
}
}
return string.Empty;
}
这是我尝试使用上述方法:
private void button1_Click(object sender, EventArgs e)
{
StringBuilder sb1 = new StringBuilder();
sb1.Append("[{\"");
sb1.Append("txid");
sb1.Append("\":\"");
sb1.Append(Convert.ToString(data["result"][Convert.ToInt32(txtFromJSON.Text)]["txid"]));
sb1.Append("\",\"");
sb1.Append("vout");
sb1.Append("\":");
sb1.Append(Convert.ToString(data["result"][Convert.ToInt32(txtFromJSON.Text)]["vout"]));
sb1.Append("}]");
StringBuilder sb2 = new StringBuilder();
sb2.Append("[{\"");
sb2.Append(Convert.ToString(data["result"][Convert.ToInt32(txtToJSON.Text)]["address"]));
sb2.Append("\":");
sb2.Append(txtAmountToSpend.Text);
sb2.Append("}]");
// {"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":["[{\"txid\":\"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26\",\"vout\":1}]","[{\"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj\":0.01}]"]}
data = JObject.Parse(RequestServer("createrawtransaction", new List<string>() { Convert.ToString(sb1), Convert.ToString(sb2) }));
MessageBox.Show(Convert.ToString(data));
}
诸如此类的其他命令确实有效:
// {"jsonrpc":"1.0","id":"1","method":"sendtoaddress","params":["2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF","0.1"]}
data = JObject.Parse(RequestServer("sendtoaddress", new List<string>() { "2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF", Convert.ToString(0.1) } ));
这也有效:
// {"jsonrpc":"1.0","id":"1","method":"listunspent","params":[]}
data = JObject.Parse(RequestServer("listunspent", new List<String>() { }));
我的问题:
我在 createrawtransaction
上做错了什么?
更新 1:
按照评论中的建议,我更改了 StringBuilder
,现在使用对象,然后使用 Newtonsoft.Json 序列化对象。
这是我第二次尝试使用来自 https://en.bitcoin.it/wiki/API_reference_(JSON-RPC)#.NET_.28C.23.29 的 API 引用代码:
private void button1_Click(object sender, EventArgs e)
{
JContainer jArray = new JArray();
JObject jFromTx = new JObject
{
{ "txid", data["result"][Convert.ToInt32(txtFromJSON.Text)]["txid"] },
{ "vout", data["result"][Convert.ToInt32(txtFromJSON.Text)]["vout"] }
};
jArray.Add(jFromTx);
JObject jToTx = new JObject
{
{ Convert.ToString(data["result"][Convert.ToInt32(txtToJSON.Text)]["address"]), Convert.ToDouble(txtAmountToSpend.Text) }
};
JContainer jArray2 = new JArray
{
jToTx
};
string strFrom = JsonConvert.SerializeObject(jArray);
string strTo = JsonConvert.SerializeObject(jArray2);
data = JObject.Parse(RequestServer("createrawtransaction", new List<string>() { strFrom, strTo }));
}
这是新的序列化 JSON:
{"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":["[{\"txid\":\"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26\",\"vout\":1}]","[{\"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj\":0.01}]"]}
与我第一次尝试的旧 StringBuilder JSON 相比:
{"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":["[{\"txid\":\"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26\",\"vout\":1}]","[{\"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj\":0.01}]"]}
我仍然收到与以前相同的错误消息(见上文)。
最佳答案
我认为问题出在你的params
array 正在双重序列化,因此服务器不知道如何解释请求。我确实意识到您的 JSON 看起来与示例相同,所以我在这里很可能是错误的;我绝对不是使用 Bitcoin Core 的 API 的专家。但是,我确实查看了 third-party library 的源代码。它应该与比特币核心兼容,并且它似乎没有对 createrawtransation
的参数进行双重序列化。要求。这让我相信双序列化参数是问题所在。
要修复,请尝试以下操作:
更改现有 RequestServer
的方法签名方法来自:
public static string RequestServer(string methodName, List<string> parameters)
为此:
public static string RequestServer(string methodName, List<JToken> parameters)
创建 RequestServer
的新重载使用旧签名的方法调用您刚刚更改的现有签名。这将允许您已经工作的其他方法(例如 sendtoaddress
和 listunspent
)继续工作而无需更改。
public static string RequestServer(string methodName, List<string> parameters)
{
return RequestServer(methodName, parameters.Select(p => new JValue(p)).ToList<JToken>());
}
最后,更改 button1_Click
中的代码方法使其不序列化jArray
和 jArray2
,而是将它们传递给 List<JToken>
至 RequestServer
.换句话说,更改此代码:
string strFrom = JsonConvert.SerializeObject(jArray);
string strTo = JsonConvert.SerializeObject(jArray2);
data = JObject.Parse(RequestServer("createrawtransaction", new List<string>() { strFrom, strTo }));
为此:
data = JObject.Parse(RequestServer("createrawtransaction", new List<JToken>() { jArray, jArray2 }));
通过这些更改,createrawtransaction
的 RPC JSON应该最终看起来像这样:
{"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":[[{"txid":"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26","vout":1}],[{"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj":0.01}]]}
请注意 params
中的额外引号和反斜杠数组不见了。与之前的比较:
{"jsonrpc":"1.0","id":"1","method":"createrawtransaction","params":["[{\"txid\":\"1a43a1f27c5837d5319a45217aa948a4d39c1d89faf497ce59de5bd570a64a26\",\"vout\":1}]","[{\"2NAZpRsvj9BstxxCDkKoe1FVjmPPxdmvqKj\":0.01}]"]}
关于c# - 无法通过 JSON-RPC 将 CREATEAWTRANSACTION 发布到比特币核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53603131/
RPC 在消息传递方面的缺点是什么? 最佳答案 您是在谈论 RPC 与消息传递吗?就像(通常)异步消息传递一样?如果这就是您所说的,那么消息传递往往会以复杂性和额外基础架构为代价变得更加健壮。 最简单
我想查看不在我钱包中的btc地址余额。似乎像 blockchainexplorer 这样的网站会做这类事情。他们还提供 API,但我遇到了他们的 API 使用限制。所以我下载了完整的区 block 链
我想获得这样的 RPC 信息: > show route output interface ae40.4181 | display xml rpc
我从我的 javascript 发送交易 Metamask 打开传输对话框 我确定 i get an error message in metamask (inpage.js:1 MetaMask -
有一个场景,客户端通过 RPC 触发 cordapp 并等待结果。 rpcConnection.proxy .startFlow(::ImportAssetFlow, importDto) .retu
super 简单的问题,我在那里找不到具体的答案。 RabbitMQ 在处理 HTTP 请求时是否适合做类似 RPC 的操作? 我有兴趣在收到用户 HTTP 请求时触发一条消息,等待来自后端服务器的响
在为我的网站编写 pingback 处理程序的过程中,我注意到 XML-RPC specification没有说明应该定义什么故障代码及其含义。所以问题是,是否有一个普遍接受的故障代码标准来指定这些信
我正在尝试创建一个可以演示 Telegram API 某些功能的小程序。我希望能够通过 SMS 注册和验证用户。根据user authorization guide ,我需要调用 auth.sendC
我将实现 JSON-RPC Web 服务。我需要这方面的规范。到目前为止,我只找到了一种可以称为真正规范的资源: JSON-RPC 1.0 http://json-rpc.org/wiki/speci
我需要学习Apache Thrift一个大学项目。这样tutorial说,它是一个 RPC 框架,也是我能找到的除 their documentation 之外的 Thrift 的唯一文档。 . 有人
我有一个多服务器多客户端应用程序,我想保留一些由单个守护进程管理的公共(public)数据(以避免并发的噩梦),这样服务器就可以在需要操作共享数据时询问它。 我已经在服务器中使用 libevent,所
我在我的代码中做了一个rpc。在成功方面,我有一些代码作为此 rpc 调用的触发器。 我的代码中有第二个 rpc。在另一个调用的成功端,我想执行第一个 rpc 成功端中的代码。 在不复制第一个rpc
我有一个奇怪的问题(希望您能提供帮助):我正在开发一个 GWT Web 应用程序,该应用程序有时会同时进行超过 4 - 5 个 GWT RPC 调用 - 就时间而言。 每隔一段时间 - 每 15 个电
我遇到了将大型 RPC 服务拆分成较小块的问题。我在这里找到了基础知识 GWT RPC - Multiple RPC Services Per App ,但我正在努力实现。我在任何地方都找不到任何好的
我目前正在使用具有一项大型 RPC 服务的 GWT 应用程序。它有 100 多个方法,所有方法都做不同的事情。如果将其拆分为多个 RPC 服务,我会获得什么样的性能优势/障碍?我相信我必须为每个人制作
有谁知道可以将 RPC/编码 WSDL 转换为 RPC/文字的工具或“黑盒”?我没有能力更改 API(这不是我的)但我想使用的工具不支持 RPC/Encoded。我想看看是否有人创建了一个简单的黑盒通
我正在调查使用 gorilla web toolkit创建一个简单的 RPC API。我正在使用他们文档中的示例,并且正在使用 Advanced Rest Client 进行测试在 Chrome 中使
由于 JSON-RPC 是面向过程的,因此我在 C# 中有一个 API 不会映射到 JSON-RPC。您将如何在 JSON-RPC 中表示面向对象的 API? 我当然可以使用 JSON-RPC 扩展,
我是来自意大利的计算机科学专业的学生,我必须做一个基于 的项目修改 Daemontools Of D.J. 的版本Bernstein 必须在 Unix 下实现远程过程调用。 通常,为了使用工具启动
我正在将 gwt 与 gwt-platform 结合使用,并使用调度异步进行服务器调用。我遇到的问题是我正在使用的操作没有被标记为可序列化或添加到 *.gwt.rpc 文件中。当我的代码运行时,我得到
我是一名优秀的程序员,十分优秀!