任何人都可以帮助解决这个问题......让我如此挣扎。
背景:一个私有区块链,所有Geth1.5.9 + Go1.8.1
三个节点。两个矿工。
节点一:Raspberry Pi with Raspbian(没有挖矿,只是作为传感器采集数据)
节点2:Ubuntu14.04云主机
节点 3:Mac OX 10.12
智能合约在节点 2 上运行,我将其设置eth.accounts[0]
为智能合约的创建者,这意味着Instance.creator()
将是eth.accounts[0]
节点 2 上的地址。
代码:
pragma solidity ^0.4.0;
contract PaperCopyright {
struct Paper{
string author;
string fileHash;
string title;
uint date;
}
address public creator;
Paper[] public papers;
function PaperCopyright() {
creator = msg.sender;
}
function add(string author,string file,string title) returns(bool) {
if(msg.sender != creator) throw;
papers.push(Paper({
author: author,
fileHash: file,
title: title,
date: now
}));
return true;
}
function edit(uint index,string author,string file,string title,uint date) returns(bool) {
if(msg.sender != creator) throw;
papers[index] = Paper({
author: author,
fileHash: file,
title: title,
date: date
});
return true;
}
function (){
throw;
}
}
互动还行。
检查通过admin.peers
,它们都相互显示两个对等点。
现在,
正常的以太交易一切都很好,没问题。我可以找到ether成功转移,并且可以在block中找到记录。
如果在节点 2 上交付交易,一切都很好,没有问题。交易记录可以在区块中找到,我可以调用Instance.paper()
来获取存储在链上的返回值。
如果交易是在节点 1 或节点 3(不是运行智能合约的节点)上交付的,就会发生错误的事情。eth.getTransactionReceipt
通过, eth.getTransaction
,来查看区块信息eth.getBlock
,我们可以发现参数已经成功上链,这意味着这个特定的交易应该已经成功了。当然,我用txpool.status
and来检查这个eth.getBlockTransactionCount("pending")
,每个节点上都会有零。但是,如果我尝试调用公共函数Instance.papers()
以获取返回值,则会显示" Error: new BigNumber() not a base 16 number:"
,这意味着合同状态尚未更改。我不认为这是因为这三个节点之间的非同步链问题,因为 transactionHash 和 transactionContent 可以在块内找到并且eth.blockNumber
完全相同。
当然,我可以很清楚的基于区块内部是否存在交易记录,数据已经成功上链,但这对我来说很奇怪,我想直接调用公共函数来查找数据放入我的私链。有任何想法吗?