Boa noite amigos!
No versículo anterior vimos a parte 11 da tradução de “A Formal Language for Analyzing Contracts”. No de hoje a décima segunda.
Acima [no versículo anterior, no caso] é uma transcrição do comportamento da máquina. Agora, tornamos ainda mais como um contrato. Aqui, incorporamos o cliente e suas escolhas, que geraram implicitamente os eventos das moedas no código acima – aqui as moedas são direitos do Titular. Pensar mais na parte, e não na máquina, nos permite reconhecer que, a cada passo, o cliente deseja feedback sobre quanto dinheiro investiu, assim, to Counterparty display(moneyAmount). Essa exibição é feita pelo Titular (a máquina de venda automática como um agente do fornecedor) como um direito da Contraparte (o cliente). Para permitir uma melhor escolha do cliente, adicionamos uma nova construção à nossa linguagem: choiceOf(agent, right), que permite ao cliente várias opções, com base no direito que ele deseja transferir para a contraparte do agente (aqui a máquina de venda, o Detentor).
sellCandy(candyPrice = $0.90) =
variable moneyAmount = $0.00
then
# coins also fall into a temporary till tempTill
when choiceOf(Counterparty, nickel)
to TempTill nickel
then to Counterparty add(moneyAmount, $0.05)
then to Counterparty display(moneyAmount)
when choiceOf(Counterparty, dime)
to TempTill dime
then to Counterparty add(moneyAmount, $0.10)
then to Counterparty display(moneyAmount)
when choiceOf(Counterparty, quarter)
to TempTill quarter
then to Counterparty add(moneyAmount, $0.25)
then to Counterparty display(moneyAmount)
when choiceOf(Counterparty, moneyReturn)
to Counterparty dropCoins(tempTill, returnTill)
with moneyAmount = $0.00
then to Counterparty display(moneyAmount)
when threshold(moneyAmount, candyPrice)
to Holder (nickel | dime | quarter)
to CounterParty redirectNewCoinsTo(returnTill)
also display(“ready to dispense — please select candy”)
then when (candySelection)
to Counterparty dropCandy(candyRacks, candySelection)
with to PermanentTill dropCoins(TempTill)
with moneyAmount = $0.00
continue
Como é que especificamos o comportamento de uma máquina de venda automática em uma linguagem projetada para a elaboração de contratos? As moedas de 5, 10 e 25 centavos, e as operações como jogar moedas de uma gaveta para outra podem ser pensadas como direitos e obrigações? Eu acho que sim. Eles não são direitos e obrigações legais, com certeza. Não há contrato explícito entre o fornecedor e os clientes da máquina de doces e, se fosse o caso, provavelmente renunciaria à responsabilidade por violar a maioria das cláusulas em nosso código. O que este código descreve é o comportamento lógico e típico de uma máquina de venda automática. Ele também reifica o entendimento implícito que muitos clientes têm ao usar uma máquina de venda automática. Assim, ele modela um “encontro de mentes” semelhante ao contrato entre o cliente e o fornecedor, mediado pela máquina.
Aqui está uma facada na descrição formal do hipotético “auto repo auto”. O carro é controlado por um proplet e ele analisa os títulos de propriedade para determinar a autoridade de propriedade. O proplet permite que apenas o proprietário intitulado entre e conduza o carro. “Titular” é o banco que fez o empréstimo e “Contraparte” é o novo proprietário. Como acima, ignoramos o vendedor de carros; o banco originalmente dono do carro. Este exemplo destaca a capacidade do idioma de descrever sucintamente contratos, mas também sua incapacidade de descrever a segurança real que aplicará o contrato. Obviamente, falta muito aqui, incluindo os itens que faltam no contrato de empréstimo de carro acima. Do ponto de vista de contratos inteligentes, a principal coisa que falta é que não há nada para motivar o “Holder getTitle (car)” no último when, nem qualquer maneira especificada aqui para aplicá-lo. E, é claro, toda conexão entre propriedade e autoridade para entrar, dar partida e dirigir o carro está aqui implícita – o comportamento real do proplet a esse respeito teria que levar em conta a segurança, o uso de emergência, etc.
Durante todo esse trabalho, na verdade, apenas adicionamos uma cláusula ao nosso contrato de compra de carro acima. A cláusula perde o título e está estruturada como as cláusulas de dano que vimos. Um evento breachedPerformance() é gerado se for detectado (pelo Titular, por um auditor de terceiros ou pelo proplet) que a Counterparty falhou em efetuar um pagamento de acordo com o cronograma especificado pelo loan [empréstimo].
loan(payment, schedule) =
for schedule
when withinPeriod(schedule.next)
payment
carPurchase(car, downPayment, monthlyPayment, schedule) =
to Counterparty getTitle(car) with to Holder downPayment
then
to Holder loan(monthlyPayment, schedule)
when breachedPerformance(loan)
to Holder getTitle(car)
Fim da parte 12, no próximo a a décima terceira parte. Grande abraço!