Ich habe ein Problem, das wahrscheinlich sehr grundlegend ist, aber ich kann das Problem nicht herausfinden
function _CreateBike(uint id, uint generation, string model, string ability, uint8 tier) internal returns(Bike){
Bike memory bike = Bike(id, generation, 1, tier, model, ability, msg.sender);
garage.push(bike);
return bike;
}
Ich habe diese Funktion oben, die eine Struktur erstellt und in ein Array schiebt, und sie funktioniert wie beabsichtigt
function BuyBike(string model, string ability, uint8 tier) public payable costs(basePrice*tier) {
Bike memory bike = _CreateBike(garage.length, current_generation, model, ability, tier);
ownedBikes[msg.sender] = [bike.id];
}
Wenn ich jedoch diese Funktion ausführe, die die frühere Funktion aufruft, wird die Struktur nicht zum Array hinzugefügt. Ich gehe davon aus, dass dies etwas mit Referenzvariablen und der Speicherung in der Blockchain im Vergleich zum lokalen Speicher zu tun hat, aber ich kann immer noch nicht herausfinden, wie ich das Problem beheben kann, nachdem ich Stackoverflow und die Solidity-Dokumente überprüft habe. Kann mir bitte jemand sagen was los ist?
Zusammenfassen der Kommentare zu einer Antwort:
Das Problem ist der costs
Modifikator, der vermutlich msg.value
. Da es (soweit ich weiß) keine Möglichkeit gibt, Ether an eine Transaktion in Remix anzuhängen, wenn die JavaScript-VM verwendet wird, gibt es keine Möglichkeit, die msg.value
Anforderung zu erfüllen, also ist die Funktion vermutlich revert
ed.
Ergänzend zur Antwort von smarx besteht eine Möglichkeit zum Testen in einer eher produktionsähnlichen Umgebung darin, ein privates Netz zu verwenden, bei dem es sich entweder um Ganache oder Ganache-Cli handeln kann, oder um ein benutzerdefiniertes privates Testnetz, das mit Geth erstellt wurde. Ich bin mir sicher, dass es andere Optionen gibt, aber das sind die, die ich verwende und von denen ich weiß, dass sie funktionieren.
Freundlicher Haftungsausschluss: Einige private Testnetze haben ihre eigenen Probleme (z. B. Ganache hat keine Unterstützung für Websockets, daher funktionieren Events nicht mit web3 1.0, private Testnetze mit Geth können andere Konsensalgorithmen haben als Mainnet), also verwenden Sie sie nicht als letzten Test, bevor Sie den Code an das Hauptnetz senden, es sei denn, Sie sind sicher, dass Ihr Code auf die gleiche Weise funktioniert.
Benutzer19510
raghava pamula
Benutzer19510
struct Bike { ... }
die Sie passiert haben, und aBike[] public garage
und a hartcodiertuint current_generation = 1
, ich habe dencosts
Modifikator von gelöschtBuyBike
, und dann habe ich aufgerufenBuyBike("model", "ability", 8)
und überprüft, dass beidegarage[0]
undgarage[1]
die erwartete Bike-Struktur in ihnen waren._CreateBike
(Es wird zweimal hinzugefügt, da es sowohl in als auch hinzugefügt wirdBuyBike
.)Benutzer19510
push
es fallen gelassen. Mit dieser Änderung wird es nur einmal hinzugefügtgarage
. (Ich habe auch dieownedBikes
Zeile gelöscht, anstatt eine andere Variable zu deklarieren.)Benutzer19510
BuyBike
und wie Sie das Ergebnis überprüfen.raghava pamula
Benutzer19510
Benutzer19510
costs
Modifikator aus zu entfernenBuyBike
. Ich vermute, dass dieser Modifikator einen bestimmten Wert in erwartetmsg.value
, und ich weiß nicht, wie ich Ether über Remix an eine Transaktion anhängen soll.raghava pamula
Benutzer19510
Benutzer19510