我是否需要始终使用 setter 因为合同本质上是永久性的?

Do I need to always use a setter since contracts are essentially permanent?

因此,据我了解,使用临时合同并在需要更改时重新部署是个好主意。假设我使用以下代码控制了一个智能灯泡。

pragma solidity 0.4.24;

contract Lightbulb {
  enum LightState { off, on }
  address public owner;
  LightState light;
  LightState constant defaultChoice = LightState.off;
  uint public cost = 1 ether;

constructor () public {
    owner = msg.sender;
 }


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

function turnOn() public payable {
    require(msg.value == cost);
    light = LightState.on;
 }

function turnOff() public {
  light = LightState.off;
 }

function getState() public view returns (LightState) {
  return light;
 }

}

如果我想改变成本,是否应该重新部署合同?另外,我可以将成本放在构造函数中,但如果我想更改成本,我仍然需要重新部署,所以这真的很重要吗?

合同部署的成本非常高,您通常希望尽可能避免它。当业务规则发生变化时,您将部署新合同。对于像您描述的那样的简单状态更改操作,您可能希望提供一个 setter 作为成本,使用 onlyOwner 修饰符来限制访问。