{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
,因为它将被解释为交易。
在以太坊智能合约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
,因为它将被解释为交易。