誰でもこれを手伝ってもらえますか...私はとても苦労しています。
コンテキスト: すべての Geth1.5.9 + Go1.8.1 を含むプライベート ブロックチェーン
3 つのノード。鉱山労働者 2 人。
ノード 1: Raspbian を使用した Raspberry Pi (マイニングは行わず、センサーとしてデータを収集するだけです)
ノード 2: Ubuntu14.04 を使用するクラウド ホスト
ノード 3: Mac OX 10.12
eth.accounts[0]
スマート コントラクトはノード 2 で実行されており、スマート コントラクトの作成者としてをセットアップしました。つまり、 がノード 2Instance.creator()
のアドレスになりますeth.accounts[0]
。
コード:
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;
}
}
インタラクションはOKです。
確認するadmin.peers
と、それらはすべて相互に 2 つのピアを示しています。
今、
通常のイーサ取引は問題ありません。正常に転送されたイーサが見つかり、ブロック内にレコードが見つかりました。
ノード 2 でトランザクションが配信された場合は、問題ありません。ブロック内にトランザクション レコードが見つかりInstance.paper()
、チェーンに格納されている戻り値を取得するために呼び出すことができます。
ノード 1 またはノード 3 (スマート コントラクトを実行しているノードではない) でトランザクションが配信されると、間違ったことが起こります。eth.getTransactionReceipt
、eth.getTransaction
、 でブロック情報を確認するeth.getBlock
と、パラメーターがチェーンに正常に配置されていることがわかりました。これは、この特定のトランザクションが成功したことを意味します。そしてもちろん、これをtxpool.status
とeth.getBlockTransactionCount("pending")
でチェックすると、各ノードでゼロになります。Instance.papers()
ただし、戻り値を取得するためにパブリック関数を呼び出そうとすると、が表示" Error: new BigNumber() not a base 16 number:"
されます。これは、コントラクト ステータスがまだ変更されていないことを意味します。eth.blockNumber
transactionHash と transactionContent はブロック内にあり、まったく同じであるため、これらの 3 つのノードにまたがる非同期チェーンの問題が原因だとは思いません。
もちろん、ブロック内のトランザクション レコードの存在に基づいて、データがチェーン上で正常にアップロードされたという事実に明確に基づくことができますが、これは私にとって非常に奇妙であり、パブリック関数を直接呼び出してデータを検索したいと考えています。私のプライベートチェーンに入れてください。何か案は?