Blockchain Can';t通过私有区块链中非合约运行节点的交易,获取智能合约中公共功能的价值

Blockchain Can';t通过私有区块链中非合约运行节点的交易,获取智能合约中公共功能的价值,blockchain,ethereum,solidity,smartcontracts,Blockchain,Ethereum,Solidity,Smartcontracts,有谁能帮我解决这个…让我如此挣扎 背景: 所有Geth1.5.9+Go1.8.1的私有区块链 三个节点。两名矿工 节点1:Raspberry Pi和Raspbian(无挖掘,仅作为传感器收集数据) 节点2:具有Ubuntu14.04的云主机 节点3:MacOx10.12 智能合约正在节点2上运行,我将eth.accounts[0]设置为智能合约的创建者,这意味着Instance.creator()将是节点2上eth.accounts[0]的地址 代码: 互动是可以的 通过admin.peers检

有谁能帮我解决这个…让我如此挣扎

背景: 所有Geth1.5.9+Go1.8.1的私有区块链

三个节点。两名矿工

节点1:Raspberry Pi和Raspbian(无挖掘,仅作为传感器收集数据)

节点2:具有Ubuntu14.04的云主机

节点3:MacOx10.12

智能合约正在节点2上运行,我将
eth.accounts[0]
设置为智能合约的创建者,这意味着
Instance.creator()
将是节点2上
eth.accounts[0]
的地址

代码:

互动是可以的

通过
admin.peers
检查,它们都会相互显示两个对等点

现在,

正常乙醚交易都很好,没有问题。我可以找到乙醚成功转移,并且可以在区块中找到记录

如果事务在节点2上交付,则一切正常,没有问题。可以在块中找到事务记录,我可以调用
Instance.paper()
来获取存储在链上的返回值

如果事务在节点1或节点3(不是运行智能合约的节点)上交付,则会发生错误的情况。通过
eth.getTransactionReceipt
eth.getTransaction
eth.getBlock
检查区块信息,我们可以发现参数已成功放置在链上,这意味着该特定事务应该已经成功。当然,我通过
txpool.status
eth.getBlockTransactionCount(“挂起”)
检查这一点,每个节点上都将为零。但是,如果我尝试调用公共函数
Instance.papers()
,以获取返回值,它会显示
“错误:new BigNumber()不是基数16:”
,这意味着合同状态尚未更改。我不认为这是因为这三个节点之间的非同步链问题,因为transactionHash和transactionContent可以在块内找到,并且
eth.blockNumber
完全相同

当然,我可以清楚地知道,数据已经成功上传到链上,这是基于块内是否存在交易记录,但这对我来说非常奇怪,我希望直接调用公共函数来查找我放入私有链中的数据。有什么想法吗?

即使合同出现错误,交易也会被记录下来 假设你的交易进行顺利,因为有一个记录在链上是错误的

您说过节点2是合同的所有者,并且您的合同仅在与节点2一起使用时有效

这是因为
if(msg.sender!=creator)抛出编辑
添加
功能中的code>

如果不是所有者的人执行该函数并回滚该函数的任何副作用,则只需停止该函数的执行。但交易仍然写在链上

因为我们希望保留事务的原子性,所以最安全的做法是恢复所有更改并使整个事务(或至少调用)不生效

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;
  }
}