{from: thesponsor, value: 10000000, gas: 3000000} 是 solidity 中的 msg 对象吗?

Is {from: thesponsor, value: 10000000, gas: 3000000} a msg object in solidity?

在以太坊智能合约IBM Example中,有如下代码:

personal.unlockAccount(thesponsor,"password"); 
ss.pledge("Good luck with the run!", {from: thesponsor, value: 10000000, gas: 3000000}); 

但是质押函数不是payable修饰符,它只接受一个arguments作为参数:

function pledge(bytes32 _message) {
  if (msg.value == 0 || complete || refunded) throw;
  pledges[numPledges] = Pledge(msg.value, msg.sender, _message);
  numPledges++;
}

那么,solidity 是否会自动将 {from: thesponsor, value: 10000000, gas: 3000000} 视为从我的帐户中转移以太币的消息对象?

我只是觉得这个功能有点奇怪。如果我写了一个 json 对象,恰好包含关键字 "from" 和 "value",我会不小心转移任何资金吗?

我希望你在半年后找到了问题的解决方案,但如果你还没有找到......

是的,您的观察是正确的,{from: thesponsor, value: 10000000, gas: 3000000} 被解释为 transactionObject。这是因为以太坊上任何导致状态更改(意味着您创建、更新或删除数据)的 transaction 都需要一个 transactionObject ,例如上面看到的那样,以允许您的代码在区块链上执行。

在下面的代码片段中,您可以看到 pledge 函数导致第 4 行和第 5 行的状态发生变化。仅此一项就需要您为交易提供 gas。此外,pledge 使用 msg.value,这是您在质押中发送的以太坊金额的价值,由 value 表示。

1  // add a new pledge
2  function pledge(bytes32 _message) {
3    if (msg.value == 0 || complete || refunded) throw;
4    pledges[numPledges] = Pledge(msg.value, msg.sender, _message);
5    numPledges++;
6  }

关于你的第二个问题,查看 https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendtransaction 以了解 transactionObject 的结构。以太坊中的函数(如果它们进行状态更改)将首先接收函数的参数,然后是后面的 transactionObject 。因此,只需确保您没有意外写入 transactionObject,因为它将被解释为交易。