Der folgende Smart Contract verhält sich im Solidity Browser und im Testnet anders:
pragma solidity 0.4.2;
contract mortal {
address owner;
function mortal() { owner = msg.sender; }
function kill() { if (msg.sender == owner) suicide(owner); }
}
contract myEscrow is mortal {
uint numEscrows;
function queryNumEscrows() constant returns (uint) {
return numEscrows;
}
function start() returns (uint) {
numEscrows++;
return numEscrows;
}
}
Auf Solidity Browser verhält es sich wie es sollte, erhöht den Wert, numEscrows
wenn start()
es aufgerufen wird, und queryNumEscrows()
gibt diesen Wert korrekt zurück.
Auf Testnet numEscrows
scheint der Wert auf 0 zu stecken. Gibt queryNumEscrows()
immer 0 zurück, egal wie oft start()
aufgerufen wurde.
Auf testnet habe ich auf diese Weise bereitgestellt:
personal.unlockAccount("0x47978a69f410d0f61850c92acdb0d4c464d70937", "pass", 86400);
personal.unlockAccount("0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d", "pass", 86400);
web3.fromWei(eth.getBalance("0x47978a69f410d0f61850c92acdb0d4c464d70937").toNumber(), "ether")
"1673.35...."
var myescrowContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"queryNumEscrows","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"}]);
var myescrow = myescrowContract.new(
{
from: web3.eth.accounts[0],
data: '60606040525b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b6101828061003f6000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480630127efc51461005257806341c0e1b51461007a578063be9a65551461008e5761004d565b610002565b346100025761006460048050506100b6565b6040518082815260200191505060405180910390f35b346100025761008c60048050506100c8565b005b34610002576100a0600480505061015c565b6040518082815260200191505060405180910390f35b600060016000505490506100c5565b90565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015957600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b60006001600081815054809291906001019190505550600160005054905061017f565b9056',
gas: 4700000
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
Contract mined! address: 0x95162fb5af8fae1970a90d891ca3862b020dda60 transactionHash: 0xfd5107184eba5cd2032759987ed7dace2de3328c2e8461b50b1d5a9a9e3ae12f
https://testnet.etherscan.io/address/0x95162fb5af8fae1970a90d891ca3862b020dda60
// This should be zero, right
myescrow.queryNumEscrows();
0
// Start escrow from Alice to Bob for 1 euro <=> 10^9 weis
myescrow.start.sendTransaction("0x90e8682b63d7922a3e942d4bbd4c88095634a17b", "0x47978a69f410d0f61850c92acdb0d4c464d70937", {from:"0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d", value:"0x3b9aca00"}, function (err, result) { if (err) { console.error(err); return; } else {console.log('txhash: ' + result)} });
0x445b6c9a7c735a54fd246596d40e2e8726244a91b98c512ca7ff9c1a5bd82c00
// After several minutes ...
myescrow.queryNumEscrows();
0
Warum numEscrows
steigt nicht?
PS: Übrigens, ich habe diesen sehr intelligenten Vertrag mit Mist im Testnet bereitgestellt und er funktioniert und erhöht sich numEscrows
ordnungsgemäß. Aber bei der Bereitstellung direkt über die Geth-Konsole funktioniert es nicht. Wieso den?
Funktioniert perfekt im Testnet.
Ich verwende das stripCrLf
Skript unter How to load Solidity source file into geth .
Hier ist Ihr Code, leicht aufgeräumt, gespeichert in MyEscrow.sol :
pragma solidity 0.4.2;
contract Mortal {
address owner;
function Mortal() { owner = msg.sender; }
function kill() { if (msg.sender == owner) suicide(owner); }
}
contract MyEscrow is Mortal {
uint numEscrows;
function queryNumEscrows() constant returns (uint) {
return numEscrows;
}
function start() returns (uint) {
numEscrows++;
return numEscrows;
}
}
Ich habe den folgenden Befehl ausgeführt, um Ihren Code zu vereinfachen:
user@Kumquat:~/ESE/Escrow$ echo "var myEscrowSource='`stripCrLf MyEscrow.sol`'"
var myEscrowSource='pragma solidity 0.4.2;contract Mortal { address owner; function Mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); }}contract MyEscrow is Mortal { uint numEscrows; function queryNumEscrows() constant returns (uint) { return numEscrows; } function start() returns (uint) { numEscrows++; return numEscrows; }}'
Ich habe den folgenden Code in meiner geth --cache=1024 --testnet console
Befehlszeile ausgeführt:
> var myEscrowSource='pragma solidity 0.4.2;contract Mortal { address owner; function Mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); }}contract MyEscrow is Mortal { uint numEscrows; function queryNumEscrows() constant returns (uint) { return numEscrows; } function start() returns (uint) { numEscrows++; return numEscrows; }}'
undefined
> var myEscrowCompiled = web3.eth.compile.solidity(myEscrowSource);
undefined
> personal.unlockAccount(eth.accounts[0], "MyVerySecretPasswordNumber1");
true
> var myEscrowContract = web3.eth.contract(myEscrowCompiled.MyEscrow.info.abiDefinition);
undefined
> var myEscrow = myEscrowContract.new({from:web3.eth.accounts[0], data: myEscrowCompiled.MyEscrow.code, gas: 1000000},
function(e, contract) {
if (!e) {
if (!contract.address) {
console.log("Contract transaction send: TransactionHash: " +
contract.transactionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
}
}
)
Contract mined! Address: 0x3fd50995536919085c28fdf9e07a03bad955cc33
myEscrow.start(eth.accounts[0], {
from:web3.eth.accounts[0],
data: myEscrowCompiled.MyEscrow.code,
gas: 1000000
});
"0x0b2ec2ee98b21214cca5be9294f3c019239d3d90f6e23c03a3eb7d6fcc8c1c29"
> myEscrow.queryNumEscrows()
1
Ihr Code funktioniert perfekt auf Testnet. Überprüfen Sie Ihre Einsatzerklärung, insbesondere Ihre myescrow.start.sendTransaction(...)
Abrechnung.
Keith Holliday
selfdestruct
jetzt verwenden. Anstelle vonsuicide
.