Balzac provides a simple syntax to express Bitcoin transactions, which is summarized as follows:

transaction txName {
        input = [redeemedTx@outputIndex : witness; ...]
        output = [value: script; ...]
        timelock = after ...


The input field of a transactions specifies which outputs it redeems. The field contains a list of transaction outputs, which are pairs transaction@outputIndex, denoted by the list delimiters [...]. Each transaction output is followed by : witness, which can be any expression (see Expressions), but commonly contains a signature.


When specifying the inputs of a transaction, if @outputIndex is omitted, the output index is assumed to be 0.


The output field of a transactions specifies its productions. The field contains a list of out-points, which are pairs value@script, denoted by the list delimiters [...]. Each script is a boolean function in the form fun(x1,..., xn) . expression (see Expressions).


When writing a transaction with only one input and/or one output, the list delimiters [...] can be omitted.


The field timelock allow to specify when a transaction will be valid. The time can be expressed either as block number, with timelock = after block 456192, or as a date, as in timelock = after date 2018-04-09. A date can also specify precisely the time, with timelock = after date 2018-04-09T10:15:30. The date formats accepted by the language are the ones parsed by Java DateTime.