Building the Lisk Ticketing Project

By creating unique tickets on a blockchain, Lisk Ticketing provides a new approach to ticket sales in which fraud will be made more difficult, and event organizers can effectively manage the entire process, including the secondary market.

By Jurre Machielsen

18 Dec 2020

lisk-ticketing.png

Current Situation

Event organizers efficiently offer their tickets for sale online. These fair priced tickets are often bought in large quantities by third party organizations, who then resell them at a profit. This is particularly disadvantageous for the end customer who lacks the ability to buy the originally priced cheaper tickets and inevitably ends up having to pay an extra fee. This additional fee does not benefit the artists or the end customers as it ends up being accrued by a middle-man third party organization.

Many private individuals also offer their tickets for sale for various valid reasons, for example, such as being absent due to illness or other obligations. This requires a clear system that on the one hand prevents rogue sellers, and on the other hand, offers a viable option for private sellers.

A possible solution to the current problem is Ticketswap. They provide a platform where you can sell and buy tickets. Since they allow a maximum margin of 20% on the tickets, this strategy tends to prevent rogue sellers from exploiting the end customers. Besides, they also perform numerous checks to ensure that no fraud is being committed.

Could blockchain technology help us solve these issues?

Our solution

With the help of blockchain technology, we can implement the services of Ticketswap in a ticketing system at a protocol level. All the administrative requirements, such as identifying individuals, and checking the authenticity of a ticket are automated through the blockchain infrastructure. It even allows an event organizer to determine the rules for the secondary market (the resale of tickets), and therefore automatically inhibits the services of Ticketswap. Additionally, it is even more flexible as these rules can be adjusted per organization and per event.

ticketing-12_0.png
Webp.net-resizeimage.png
Webp.net-resizeimage copy.png

Additional details

The current problems of ticket resales will be resolved by our solution that captures the tickets on a blockchain.

An event organizer creates an event on the ticket chain. The chain provides the possibility to customize events and tickets. An organizer can indicate that tickets cannot be resold, or only sold at a fixed maximum profit percentage.

As tickets are linked to an account on the blockchain, a ticket cannot switch between users off-chain. Every transaction will be recorded on the chain. Furthermore, each ticket contains specific properties determined by the organizer before the sale starts.

Additional options for these tickets consist of an automatic refund when an event is canceled, as well as future updates regarding events, which can be easily and directly communicated to the ticket holders.

Within the application, tickets can be resold to other users, as it is a central location to source and buy tickets. We have determined that it is not necessary anymore to even have a second hand marketplace. Swaptickets can be found at the original event-website.

Hence, Lisk Ticketing provides a solution to manage the process from the moment of creating an event right up to the ticket sales and entry to an event.

Business opportunities & interoperability

This is a proof of concept ticketing solution. At this stage, there are still many ideas and uncertainties regarding future opportunities related to digital tickets on a blockchain infrastructure.

For example, we can add the possibility for artist accounts and provide them with an automatic fee (after a sale and/or resale). Alternatively, we could connect with a separate “Artist Chain” whereby the artist could offer a discount to everyone who previously attended a specific event, which can be fully automated.

Technical details - built with SDK v5

Lisk Ticketing makes use of the following 8 registered modules, (organizer, sprinkler, token, sequence, keys, dpos, event, ticket).

Modules
Token (sdk module)
Sequence (sdk module)
Keys (sdk module)
dpos (sdk module)
ModulesTransaction Assets
OrganizercreateOrganizer
Sprinklersprinkle
EventcreateEvent cancelEvent
TicketbuyTicket scanTicket sellTicket transferTicket buyMarketTicket

Use the standard API
https://api-ticketswap.moosty.com/api/node/info for more information about the "registered Modules".

Webp.net-resizeimage copy 212.png
Webp.net-resizeimage copy_0.png
Webp.net-resizeimage copy 2.png

Create organizer account (using the organizer module)

  • This will create a special account for event organizers
  • Only event organizers are able to perform a "create event" transaction & scan the tickets
  • Organizers are not able to buy tickets

Create event

  • An organizer account has the possibility to create events through a create event transaction
  • With this transaction, it states event information, ticket information, and resale information
  • It provides the possibility of stating different type of tickets (early bird, premium, different price scales), and which actions can be performed.

Cancel event

An event can be canceled in a way that ticket holders will automatically be refunded. The percentage to be refunded is set in the "create event" transaction

Scan ticket

The organizer scans the QR-code of a ticket when a ticket holder requests access to enter the event. The scanTicket transaction changes the status of the ticket on the blockchain

ticketing-13.png
Webp.net-resizeimage copy 3.png
Webp.net-resizeimage copy 4.png

Create user account

  • This will create a normal account for ticket holders.
  • This account will enable a user to own tokens, browse events and buy, (sell and resell) tickets.

Buy ticket

Buy a ticket or a swapticket.

Sell tickets (p2p)

Ticket holders can resell their ticket on the second hand marketplace.

Transfer ticket

Send your ticket to a friend.

Enter event

Show the QR code at the beginning of the event.

Tickets can be used digitally and printed on paper, with the QR code(s), and can be validated and authenticated to the owner.

Webp.net-resizeimage copy13.png
Webp.net-resizeimage_0.png
Webp.net-resizeimage copy 7.png

Lisk SDK v5

This PoC was built using the Lisk SDK v5. This latest version has many new advantages as compared to the previous ones. In previous versions, it was possible to build custom transaction logic to customize your blockchain. However, in v5 it is possible to build modules and assets (custom transactions). Custom modules are built to define account properties, and a set of transactions to change the state of these account properties. The custom transactions can change the account state properties defined in the module.

Modules can have actions and reducers. Actions are used to gather a state off-chain, these are not used to change anything onChain. Reducers are used for onChain changes. For example, the token module has reducers called credit and debit. So when making a custom transaction where you have to pay LSK tokens to another account, you can debit the token balance of the sender and credit those tokens to a receiving account through these reducers.

Lisk Ticketing has 4 custom modules and a combined total of 9 custom transactions (see tables 1a & 1b). The organizer module stores the name of an organizer, and upon sending the register organizer transaction it gives the account tokens for test purposes. The events module stores events and stores their IDs in the organizer’s account which holds the event. The tickets module stores owned ticket IDs in the user’s account. Finally, the sprinkler module is a proof of concept faucet module which grants a user tokens to test the LisTicketing proof of concept.

In this PoC you can buy tickets from an organizer or a reseller with LSK tokens. When buying a ticket, the cost will be subtracted from the buyers LSK balance by using the token debit reducer.

File name
1
2The same amount of tokens will be added to the organizer (owner of an event).
html await reducerHandler.invoke("token:credit", { address: organization.ownerAddress, amount: asset.value, });
File name
1
2A ticket is registered in an account once that ticket is created on the blockchain in its own database with a unique id. The tickets have the following properties:
3
4* id
5* ownerAddress
6* eventId
7* typeId
8* value
9
10The owner's address is the account that owns the ticket, the eventId corresponds to an event, the typeId links to the type of ticket the user bought, and finally, the value is the number of tokens used to pay for the ticket.
11
12The ticket module adds a "tickets" property to the account. In the buyTicket transaction, a ticket is created and the unique id is added to the list in the tickets property of the account. To determine how many unsold tickets are remaining,the event needs to be updated. This is also performed using a reducer.
html await reducerHandler.invoke("event:soldTicket", { eventId: asset.eventId, typeId: asset.typeId, });
File name
1
2The soldTicket reducer from the event module will increment the sold property of the ticket type from the specified eventId by 1 and saves all events in the event store.
html const soldTicket = async ({params, stateStore}) =

{ const { eventId, typeId } = params; const registeredEventsBuffer = await stateStore.chain.get( CHAIN_STATE_EVENTS ); if (!registeredEventsBuffer) { throw new Error('No events found'); } const registeredEvents = codec.decode( eventSchema, registeredEventsBuffer ); const eventIndex = registeredEvents.events.findIndex(e =>e.id.toString('hex') = eventId); if (eventIndex = -1) { throw new Error('Event not found'); } const typeIndex = registeredEvents.events[eventIndex].ticketData.findIndex(t => t.id = typeId); if (typeIndex = -1) { throw new Error('Ticket type not found'); } registeredEvents.events[eventIndex].ticketData[typeIndex].sold++; await setAllEvents(stateStore, registeredEvents.events); } ```

Concluding remarks

With Lisk Ticketing we have built our first blockchain app with the Lisk SDK v5. The introduction of the module structure was a welcome addition to the Lisk SDK. It provides a more structured way of building custom blockchains.

App:https://ticketing.moosty.com/

Explorer:https://explorer.moosty.com/ (switch to Lisk Ticketing with the button at the bottom right)

API - node & account info:https://api-ticketswap.moosty.com/api/node/info

API Extended - blockchain specific:https://eapi-ticketswap.moosty.com/api/events

Github Front-endhttps://github.com/Moosty/lisk-ticketing/

Github Back-end:https://github.com/Moosty/lisk-ticketing-chain

Disclaimer: This blog post was written by our community member, Jurre (LinkedIn profile) as part of his participation in the Lisk Builders program.