2

在以太坊智能合约的IBM 示例中,有以下代码:

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

然而,质押函数不是支付修饰符,它只接受一个参数作为参数:

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} 视为从我的账户转移以太币的 msg 对象?

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

4

1 回答 1

1

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

是的,您的观察是正确的,{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意外写入,因为它将被解释为事务。

于 2017-12-03T16:27:27.177 回答