Blockchain Can';t通过私有区块链中非合约运行节点的交易,获取智能合约中公共功能的价值
有谁能帮我解决这个…让我如此挣扎 背景: 所有Geth1.5.9+Go1.8.1的私有区块链 三个节点。两名矿工 节点1:Raspberry Pi和Raspbian(无挖掘,仅作为传感器收集数据) 节点2:具有Ubuntu14.04的云主机 节点3:MacOx10.12 智能合约正在节点2上运行,我将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检
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;
}
}