2

任何人都可以帮助解决这个问题......让我如此挣扎。

背景:一个私有区块链,所有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.statusand来检查这个eth.getBlockTransactionCount("pending"),每个节点上都会有零。但是,如果我尝试调用公共函数Instance.papers()以获取返回值,则会显示" Error: new BigNumber() not a base 16 number:",这意味着合同状态尚未更改。我不认为这是因为这三个节点之间的非同步链问题,因为 transactionHash 和 transactionContent 可以在块内找到并且eth.blockNumber完全相同。

当然,我可以很清楚的基于区块内部是否存在交易记录,数据已经成功上链,但这对我来说很奇怪,我想直接调用公共函数来查找数据放入我的私链。有任何想法吗?

4

1 回答 1

0

即使合约抛出错误,交易也会被记录

假设您的交易顺利,因为链上记录了一个错误。

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

这是因为 if(msg.sender != creator) throw;在你的editadd功能中。

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

因为我们要保留事务的原子性,所以最安全的做法是还原所有更改并使整个事务(或至少调用)无效。

http://solidity.readthedocs.io/en/develop/control-structures.html#exceptions

于 2017-05-15T14:12:14.273 回答