Ethereum プライベート ネットワーク (geth) では、非常に単純なコントラクト (Solidity) を使用しています。
バージョン 1:
contract T {
string log;
function getLastLog() constant returns (string lastLog) { return log; }
function T() { log = "[call end]: T()\n"; }
struct TData {
uint amount;
}
mapping (address => uint) balance;
mapping (address => TData) mystructmap;
function setBalance(address _user, uint _balance) {
log = "[call start]: setBalance()\n";
balance[_user] = _balance;
mystructmap[_user] = TData({amount: 42});
log = "[call end]: setBalance()\n";
}
function getBalance(address _user) constant returns (uint _balance) {
return balance[_user];
}
function get42(address _user) constant returns (uint _fourtytwo) {
return mystructmap[_user].amount;
}
}
コントラクトをデプロイしてから、次のように呼び出します ( web3.jsから):
- 契約.getLog()
- contract.setBalance(有効なアドレス、55)
- 契約.getLog()
- contract.getBalance(住所)
- contract.get42(アドレス)
そして、私は出力結果として得ます:
- [通話終了]: T()
- [通話終了]: setBalance()
- 55
- 42
ここで、TData 構造体に新しいフィールドを 1 つ追加するだけです。
バージョン 2:
contract T {
string log;
function getLastLog() constant returns (string lastLog) { return log; }
function T() { log = "[call end]: T()\n"; }
struct TData {
uint somedata;
uint amount;
}
mapping (address => uint) balance;
mapping (address => TData) mystructmap;
function setBalance(address _user, uint _balance) {
log = "[call start]: setBalance()\n";
balance[_user] = _balance;
mystructmap[_user] = TData({somedata: 11, amount: 42});
log = "[call end]: setBalance()\n";
}
function getBalance(address _user) external constant returns (uint _balance) {
return balance[_user];
}
function get42(address _user) external constant returns (uint _fourtytwo) {
return mystructmap[_user].amount;
}
}
上記と同じ呼び出しを行います。
- 契約.getLog()
- contract.setBalance(有効なアドレス、55)
- 契約.getLog()
- contract.getBalance(住所)
- contract.get42(アドレス)
しかし、今私は得る:
- [通話終了]: T()
- [通話終了]: T()
- 0
- 0
「setBalance()」関数が実行されていない (またはどこかで終了している) ようで、ストレージの状態は変更されていません。
助けてください!
ありがとう。