簡體   English   中英

無法通過私有區塊鏈中非合約運行節點的交易獲得智能合約中具有公共功能的價值

[英]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.getTransactionReceipteth.getTransactioneth.getBlock檢查信息塊,我們可以發現參數已成功放置在鏈上,這意味着該特定事務應該成功。 當然,我通過txpool.statuseth.getBlockTransactionCount("pending") ,並且每個節點上都為零。 但是,如果我嘗試調用公共函數Instance.papers()以獲取返回值,它將顯示" Error: new BigNumber() not a base 16 number:" ,這意味着合同狀態尚未更改。 我不認為這是因為這三個節點之間存在非同步鏈問題,因為在塊內可以找到transactionHash和transactionContent,而eth.blockNumber完全相同。

當然,我可以很清楚地基於這樣一個事實,即數據已經成功地基於區塊中存在事務記錄的鏈式上傳了,但這對我來說很奇怪,我希望直接調用public函數來查找數據放在我的私人連鎖店中。 有任何想法嗎?

即使合同出錯,也會記錄交易

假設您的交易進行順利,因為鏈上記錄了一筆交易是錯誤的。

您說節點2是合同的所有者,並且您的合同僅在與節點2一起使用時才有效。

這是因為if(msg.sender != creator) throw; 在您的editadd功能中。

如果不是所有者的某人執行該功能並回滾該功能的任何副作用,這只會停止執行該功能。 但是交易仍然寫在鏈上。

因為我們要保留事務的原子性,所以最安全的做法是還原所有更改並使整個事務(或至少調用)無效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM