Solidity

web3.py 如何處理常量 getter 函式?

  • January 24, 2018

我已經建立了一個智能合約,現在我正在使用web3.py. 在我的契約中,我聲明了一些私有變數,並創建了帶有修飾符的 getter 函式來返回這些私有變數。但是,如果我呼叫 getter 函式,則返回私有變數,無論此時哪個帳戶被解鎖。在 中進行測試時Remix,如果從同一帳戶訪問,則不會返回該值。有人知道這是一個web3.py錯誤還是與契約邏輯有關?

pragma solidity ^0.4.16;

contract exampleContract {
   uint256 private value;
   address public owner;

   modifier onlyOwner {
       require(msg.sender == owner);
       _;
   }

   function exampleContract(uint256 _value) public {
       owner = msg.sender;
       value = _value;
   }

   function viewValue() onlyOwner public returns(uint256) {
       return(value);
   }
}

編輯:

我認為這與 .Concise Contract 類有關 web3.py。使用 web3.py函式call(),如果沒有通過transact字典提供,預設發送地址是什麼?

from web3 import Web3, IPCProvider
from web3.contract import ConciseContract

ipc_path = '/path/to/geth.ipc'
web3 = Web3(IPCProvider(ipc_path)
contract = web3.eth.contract(abi = abi, address = address, ContractFactoryClass = ConciseContract)
contract.viewValue() #Who is the sender when unlocking of an account is not required?

在我的契約中,我聲明了一些私有變數,並創建了帶有修飾符的 getter 函式來返回這些私有變數

重要的是要了解這些值並不是真正的“私有”。任何人都可以檢查區塊鏈以發現這些價值。private關鍵字只會使其不那麼方便。

如果任何人都可以讀取您的私人價值是一件壞事,那麼您將需要找到另一種方法來實現您的目標。

如果沒有通過transact字典提供,預設發送地址是什麼?

它與事務中的預設發件人相同:它預設為web3.eth.defaultAccount或您的客戶端預設發件人是什麼。

既然你想打電話,你應該提供一call本字典。那看起來像:

contract.viewValue(call={'from': SENDING_ACCOUNT})

值得重複一遍:這不是一種有效的機制來隱藏價值。

這很可能與您設置值的邏輯有關。

乙太坊節點將返回舊值,直到您呼叫的交易exampleContract(uint256 _value)被探勘。

根據您的乙太坊節點設置(未在問題中描述),這可能是瞬間、幾秒鐘或幾分鐘。

引用自:https://ethereum.stackexchange.com/questions/32113