[英]Can't get the value with public function in smart contract by a transaction from a non-contract-running node in a private blockchain
任何人都可以幫忙...讓我很努力。
上下文:具有所有Geth1.5.9 + Go1.8.1的私有區塊鏈
三個節點。 兩個礦工。
節點1:帶有Raspbian的Raspberry Pi(不進行挖掘,僅作為傳感器收集數據)
節點2:具有Ubuntu14.04的雲主機
節點3:Mac OX 10.12
一個智能合約在節點2上運行,我將eth.accounts[0]
為智能合約的創建者,這意味着Instance.creator()
將是節點2上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;
}
}
互動還可以。
通過admin.peers
檢查,它們都相互顯示兩個對等體。
現在,
正常的以太幣交易都很好,沒問題。 我可以找到以太坊成功轉移的記錄,並且可以在該區塊中找到記錄。
如果事務在節點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:"
,這意味着合同狀態尚未更改。 我不認為這是因為這三個節點之間存在非同步鏈問題,因為在塊內可以找到transactionHash和transactionContent,而eth.blockNumber
完全相同。
當然,我可以很清楚地基於這樣一個事實,即數據已經成功地基於區塊中存在事務記錄的鏈式上傳了,但這對我來說很奇怪,我希望直接調用public函數來查找數據放在我的私人連鎖店中。 有任何想法嗎?
假設您的交易進行順利,因為鏈上記錄了一筆交易是錯誤的。
您說節點2是合同的所有者,並且您的合同僅在與節點2一起使用時才有效。
這是因為if(msg.sender != creator) throw;
在您的edit
和add
功能中。
如果不是所有者的某人執行該功能並回滾該功能的任何副作用,這只會停止執行該功能。 但是交易仍然寫在鏈上。
因為我們要保留事務的原子性,所以最安全的做法是還原所有更改並使整個事務(或至少調用)無效。
http://solidity.readthedocs.io/en/develop/control-structures.html#exceptions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.