Daten in die über Factory erstellte Vertragsinstanz schreiben

Ich versuche, die folgende App mit Truffle in meiner privaten Kette auszuführen.

Ich habe eine AuctionFactory erstellt, die neue Auktionsobjekte für neue Auktionatoren generieren würde. Auktionsfabrik sieht so aus:

pragma solidity ^0.4.11;

import '../contracts/Auction.sol';

contract AuctionFactory {

// contains the owner of an auction mapped to the address of that auction
mapping( address => address) public auctions;

function createAuction(uint32 pTicketPerPerson, uint256 pTotalTickets, uint256 pEndTime, uint32 pMinimumBid) returns (address auctionAddress) {

    address owner = msg.sender;
    Auction newAuction = new Auction(owner, pTicketPerPerson, pTotalTickets, pEndTime, pMinimumBid);
    auctions[owner] = newAuction;
    return newAuction;

}


function getAuctionAddress( address auctioneer) returns (address auctionAddress) {

    //do some sanity
    return auctions[auctioneer];
}
}

Dies ist der Auktionsvertrag

pragma solidity ^0.4.11;

  contract Auction {

    uint32 ticketId = 0;
    uint32 public balanceTikets;
    uint32 public ticketPerPerson;
    uint32 public minimumBid;
    uint32 public highestBid;
    uint256 public totalTickets;
    uint256 public endTime;
    uint256 public lastBid;

    address public lastBidder;
    address public auctioneer;

    mapping( address => Ticket[]) public allotedTicketsCount;

    mapping( address => uint256) public bids;

    event BidCreated(address bidder, uint32 bidAmount);
    event HighestBid(address bidder, uint32 bidAmount);

    struct Ticket {
       uint32 id;
       uint32 pricePaid;
    }


    /**
    * Constructor which will be called
    * for each new auction that is created. The requestor becomes the owner of new auction
    * 
    */
    function Auction(address owner, uint32 pTicketPerPerson, uint256 pTotalTickets, uint256 pEndTime, uint32 pMinimumBid ) {
      auctioneer = owner;
      ticketPerPerson = pTicketPerPerson;
      totalTickets = pTotalTickets;
      endTime = now + (pEndTime * 1 hours );
      minimumBid = pMinimumBid;
      highestBid = pMinimumBid; // start with 
    }


    function bidForTicket(address bidder, uint256 amount)  {

     bids[bidder] = amount;
     lastBidder = bidder;
     lastBid = amount;

   }

   function getBidFor(address bidAddress) returns (uint256 bidAmt) {
      return bids[bidAddress];
   }

  }

Das Truffle-Migrationsskript für die Fabrik hat dies

    var AuctionFactory = artifacts.require("./AuctionFactory.sol");

    module.exports = function(deployer) {
      deployer.deploy(AuctionFactory, {gas: 1583814});
    };

Ich verwende Truffle, um eine Beispiel-Benutzeroberfläche zu erstellen, um mit diesen zu arbeiten. Die app.js sieht so aus

    import { default as Web3} from 'web3';
    import { default as contract } from 'truffle-contract'
    // Import our contract artifacts and turn them into usable abstractions.
    import auctionFactory from '../../build/contracts/AuctionFactory.json'
    import auction from '../../build/contracts/Auction.json'

    var AuctionFactory = contract(auctionFactory);
    var Auction = contract(auction);

    window.bid = function() {
        let auctioneerId = $('#auctioneerId').val();
        let bidder = $('#bidder').val();
        let bidAmount = $('#bidAmount').val();
        console.log("Bid details " + bidAmount + " " + bidder);
        AuctionFactory.deployed().then(function(factoryInstance) {
                console.log("Factory address " + factoryInstance.address);
                factoryInstance.getAuctionAddress.call(auctioneerId).then(function(result) {
                    var myAuction = Auction.at(result);
                    console.warn("address of auction  "  + result);
                        //try to get some values from the auction

             myAuction.totalTickets.call().then(function(totalTickets) {
                console.warn("Total Tkts  " + totalTickets);
                $("#total_tkt").html(totalTickets+"");
            });


                    myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder}).then(function() {
                        console.warn("Bid created ");
                        myAuction.lastBidder.call().then(function(lastBidder) {
                            console.warn("Last bidder  " + lastBidder);

                        });

                        myAuction.lastBid.call().then(function(lastBid) {
                            console.warn("lastBid is " + lastBid);

                        });

                        myAuction.getBidFor.call(bidder).then(function(bidAmt) {
                            console.warn("Bid amt for " + bidder + " " + bidAmt);

                        });

                    });


                });                 
        });
    }

Ich kann eine Auktion erstellen. Holen Sie sich seine Adresse von der AuctionFactory basierend auf dem Auktionsersteller. Wenn ich Werte lese, die während der Initialisierung der Auktion festgelegt wurden, wie:

myAuction.totalTickets.call()

Ich bin in der Lage, korrekte Daten zu erhalten.

Aber wenn ich versuche, der Auktion ein Gebot hinzuzufügen, verwende ich

myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder})

Dieser Wert wird dem Auktionsvertrag nie hinzugefügt. Ich habe die Adressen und andere Konfigurationen überprüft.

Ich habe versucht, den Auktionsvertrag separat als Einzelvertrag bereitzustellen, und kann Gebote erstellen und aktualisierte Werte lesen. Aber wenn ich die von der Fabrik erstellte Auktion verwende, schreibt sie einfach keine Werte. Ich meine, wenn ich diese Felder lese, bekomme ich 0 und die Adresse des letzten Bieters als 0x0

Würde wirklich gerne verstehen, was ich hier übersehe? Vielen Dank im Voraus.

Antworten (1)

Nur für den Fall, dass sich jemand anderes die Syntax zerbricht: Die Änderung, die ich vornehmen musste, damit das funktioniert, war in der app.js. Anstatt

myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder}).then(function() 

Ich musste es ändern in:

var txnHash = bidProduct.bid.sendTransaction(bidAmount, {gas: 1400000, from:bidder}).then(function(txnHash) {.....

Ich meine, der Rückgabewert kann immer noch ignoriert werden, aber "sendTransaction" hat meiner Meinung nach den Trick für mich getan. Laut Dokumentation hätte das Aufrufen der Methode funktionieren sollen und ich hätte den Transaktions-Hash erhalten sollen, aber ich konnte nicht ganz herausfinden, warum es mit dem vorherigen Code nicht funktionieren würde.