pragma solidity ^0.4.9; //------------------------------------------------------------------------------ //アカウントを管理するコントラクト。以下の機能を実装する // ・ユーザーアカウントの作成 // ・アカウントへの入金/残高確認 // ・ユーザー間の支払い //------------------------------------------------------------------------------ contract Accounts { uint accountId; //ユーザーアカウントID struct Account { address addr; //ユーザーアドレス(今回はパスワードとして利用) uint balance; //アカウント残高 } mapping(uint => Account) accounts; //ユーザーアカウントの連想配列 function Accounts(){ //コンストラクタ 今回は処理なし } //1.口座を新規作成する function createAccount(address _addr)returns(uint _accountId) { accountId += 1; accounts[accountId].addr = _addr; accounts[accountId].balance = 0; return accountId; } //2.口座に入金する function deposit(uint _fromAccId, address _accAddr, uint _cash)returns(bool _ret) { if(accounts[_fromAccId].addr != _accAddr)//アドレス値が正しくない場合は処理せず終了(アドレス値をパスワードとして利用) return false; accounts[_fromAccId].balance = accounts[_fromAccId].balance + _cash; return true; } //3.口座残高を取得(参照)する function getAccountInfo(uint _id)constant returns(address _addr, uint _balance) { return ( accounts[_id].addr, //セキュリティ観点では本来この値を戻すのは問題:本稿ではアドレス型の値の形式を紹介するためにあえて戻り値にする accounts[_id].balance ); } //ユーザー間で支払いをする function payment(uint _fromAccId, address _accAddr, uint _toAccId, uint _money)returns (bool _ret) { if(accounts[_fromAccId].balance < _money)//残高不足の場合は処理せず終了 return false; if(accounts[_fromAccId].addr != _accAddr)//アドレス値が正しくない場合は処理せず終了(アドレス値をパスワードとして利用) return false; accounts[_fromAccId].balance -= _money; accounts[_toAccId].balance += _money; return true; } } //------------------------------------------------------------------------------ //チケットを管理するコントラクト。以下の機能を実装する // ・チケットの新規発行 // ・チケット情報の取得(参照) // ・最新のチケット発行番号を取得(参照)する // ・チケットを購入する //------------------------------------------------------------------------------ contract Tickets { uint ticketId; //チケットの発行番号 struct Ticket{ uint issuer; //チケットの発行者 string ticketName; //チケット名 uint price; //チケットの価格 uint issuedAmount; //チケットの発行枚数の総量 uint salesCount; //発行済みチケットの枚数 } mapping(uint => Ticket) tickets; //チケットの連想配列 function Tickets(){ //コンストラクタ 今回は処理なし } //4.チケットを発行する function issueTicket(uint _issuerId, string _ticketName, uint _price,uint _issuedAmount)returns(uint _ticketId) { ticketId += 1; tickets[ticketId] = Ticket(_issuerId, _ticketName, _price, _issuedAmount, 0); return ticketId; } //5.チケットの情報を取得(参照)する function getTicketInfo(uint _ticketId) constant returns(uint _issuer,string _ticketName, uint _price, uint _issuedAmount, uint _salesCount) { return ( tickets[_ticketId].issuer, tickets[_ticketId].ticketName, tickets[_ticketId].price, tickets[_ticketId].issuedAmount, tickets[_ticketId].salesCount ); } //6.現在のチケット発行番号を取得(参照)する function getCurrentTicketId() constant returns(uint _id) { return ticketId; } //チケットを購入する function buyTicket(uint _ticketId,address _contractAddr, uint _buyerAccId, address _buyerAddr, uint _sellerAccId, uint _money)returns(bool _ret) { if(tickets[_ticketId].salesCount >= tickets[_ticketId].issuedAmount) //チケットの発行総量より発行済み枚数が多くなる場合は処理せずに終了する return false; Accounts acc = Accounts(_contractAddr); //Acountsコントラクトを生成する acc.payment(_buyerAccId,_buyerAddr,_sellerAccId,_money); tickets[_ticketId].salesCount += 1; return true; } }