Smart Contracts dla Ludzi
19 października 2018
Wiele wiadomości związanych z blockchainem w dzisiejszych czasach mówi nam, że bank X lub korporacja Y
zamierza użyć "blockchainu" do "redukcji kosztów". W zasadzie oznacza to, że kolejny modny termin jest
postrzegany przez wielkich bankierów jako kolejny sposób na wydobycie wartości z wszędzie w bardziej efektywny sposób,
a także na oszczędności związane z redukcją miejsc pracy.
Chociaż staram się unikać mówienia czegokolwiek o "wizji Satoshiego" (nic poza spekulacjami nie można tam znaleźć po
jego exodusie), szeroki pogląd, który zaobserwowałem w pierwszych latach na forach internetowych, jest taki, że kryptowaluta
powinna dostarczać narzędzi, aby wzbogacić zwykłych ludzi prowadzących małe firmy, które ledwo wiążą koniec z końcem, a nie bezosobowy wielki kapitał finansowy. Narzędzia
kryptowaluty w oczach oryginalnej wizji szerokiej społeczności powinny pozwalać ludziom na prowadzenie działalności gospodarczej niezależnie od wielkości firmy, lokalizacji geograficznej, stóp procentowych ustalanych przez wielkich graczy itd.
Narzędzia powinny pozwalać ludziom na zawieranie umów (nie papierowych umów, ale cyfrowych, samowykonawczych i rozsądnie inteligentnych umów) niezależnie od różnic w jurysdykcjach, tradycjach, stosowanych praktykach biznesowych itd.
Mam nadzieję, że Ergo będzie tutaj przydatne. Tysiące małych spółdzielni i indywidualnych przedsiębiorców są ważniejsze dla zdrowego i zrównoważonego wzrostu bogactwa na całym świecie niż kilka korporacji ukrywających zyski w offshore'owych rajach.
Na przykład, rozważmy federację spółdzielni (taką jak Radical Routes), która chce zapewnić pomoc finansową przedsiębiorcy oddalonemu o tysiące kilometrów (powiedzmy, w Rojavie).
Musimy teraz założyć pewne szczegóły. Po pierwsze, załóżmy, że w sieci są cztery spółdzielnie. Łącznie blokują 10,000 Ergs (w równych częściach, więc 2,500 Ergs każda) w umowie, która mówi co następuje:
- Spółdzielnie są powiązane z kluczami publicznymi pubkeyA, pubkeyB, pubkeyC, pubkeyD. Przedsiębiorca jest powiązany z kluczem publicznym businessKey.
- Spółdzielnie blokują pieniądze w monetach chronionych umową finansową, następnie przeprowadzają należyta staranność i głosują, czy sfinansować przedsiębiorcę, czy nie. Cały fundusz umowy (10,000 Ergs) trafia do przedsiębiorcy, jeśli 3 głosy z 4 są za tym. Technicznie, głosowanie odbywa się za pomocą podpisu progowego 3 z 4. Jeśli głosowanie nie powiedzie się (3 z 4 podpisów nie zostanie zebranych) przed numerem bloku 1,000, każda spółdzielnia (właściwie, każdy) może złożyć transakcję wypłaty, która zwraca 2,500 Ergs (przynajmniej) każdej spółdzielni. Ponadto, umowa finansowa będzie również nazywana umową głosowania.
- Inwestycje mogą być wydawane na trzy cele, z pewnymi ścisłymi ograniczeniami. Mianowicie, przedsiębiorca musi wydać co najmniej 5,000 Ergs na sprzęt, co najmniej 2,000 Ergs na budowę potrzebnego budynku, inne fundusze przedsiębiorca może wydawać dowolnie.
- Aby upewnić się, że pieniądze na sprzęt zostaną wydane na sprzęt, federacja spółdzielni korzysta z kluczy publicznych znanych sprzedawców sprzętu w okolicy przedsiębiorcy. Na przykład, załóżmy, że w okolicy są sprzedawcy sprzętu z kluczami publicznymi pubkeyTool1, pubkeyTool2, pubkeyTool3, pubkeyTool4. Technicznie, transfer jest organizowany jako zbiorowy podpis jednego ze sprzedawców sprzętu (tak więc podpis pierścieniowy od sprzedawców sprzętu ORAZ podpis przedsiębiorcy)
- Podobnie, załóżmy, że w federacji spółdzielni są 3 budowniczych, których federacja uznaje, powiązanych z kluczami publicznymi pubkeyConstr1, pubkeyConstr2 i pubkeyConstr3.
- Podobnie jak w umowie głosowania, jeśli umowy na sprzęt i budowę nie zostaną współpodpisane przed numerem bloku 5000, spółdzielnie federacji mogą wycofać fundusze.
Istnieją różne sposoby definiowania umów w Ergo. Skrypt w niskopoziomowym języku, ErgoTree, opisuje (pojedynczy) warunek logiczny, czy moneta może być wydana zgodnie z nim, a także dowód wydania dostarczony przez transakcję wydania. Wewnątrz warunek jest reprezentowany jako typowy drzewo składniowe, stąd nazwa. Struktura pozwala nam na przeprowadzenie analizy kosztów z wyprzedzeniem itd. Wyższy poziom języka, nazywanego ErgoScript, pozwala na bardziej tradycyjne i czytelne opisy, używanie zmiennych i dzielenie logiki na podprogramy.
Zacznijmy od głównej umowy zdefiniowanej w (1-3) powyżej:
{
val votingSuccess = atLeast(3, Array(pubkeyA, pubkeyB, pubkeyC, pubkeyD))
val properSpending = OUTPUTS(0).value >= 5000L &&
blake2b256(OUTPUTS(0).propositionBytes) == spendingContract1Hash &&
OUTPUTS(1).value >= 2000L &&
blake2b256(OUTPUTS(1).propositionBytes) == spendingContract2Hash
val withdrawCondition = HEIGHT >= 1000L &&
OUTPUTS(0).value >= 2500L && OUTPUTS(0).propositionBytes == pubkeyA.propBytes &&
OUTPUTS(1).value >= 2500L && OUTPUTS(1).propositionBytes == pubkeyB.propBytes &&
OUTPUTS(2).value >= 2500L && OUTPUTS(2).propositionBytes == pubkeyC.propBytes &&
OUTPUTS(3).value >= 2500L && OUTPUTS(3).propositionBytes == pubkeyD.propBytes
(votingSuccess && properSpending) || withdrawCondition
}
Ten skrypt w ErgoScript ma być skompilowany do drzewa składniowego (które ma być zapisane w blockchainie w zserializowanej formie) poprzez powiązanie go z konkretnymi wartościami dla zmiennych (pubkeyA, pubkeyB, pubkeyC, pubkeyD, spendingContract1Hash, spendingContract2Hash). spendingContract1Hash to hash (zserializowanego) skryptu wydania sprzętu, który zostanie podany poniżej, spendingContract2Hash to hash skryptu wydania budowy.
Skrypt wydania sprzętu jest poniżej:
{
val spendingSuccess = (pubkeyTool1 || pubkeyTool2 || pubkeyTool3 || pubkeyTool4) && businessKey
val withdrawCondition = HEIGHT > 5000L &&
OUTPUTS(0).value >= 1250L && OUTPUTS(0).propositionBytes == pubkeyA.propBytes &&
OUTPUTS(1).value >= 1250L && OUTPUTS(1).propositionBytes == pubkeyB.propBytes &&
OUTPUTS(2).value >= 1250L && OUTPUTS(2).propositionBytes == pubkeyC.propBytes &&
OUTPUTS(3).value >= 1250L && OUTPUTS(3).propositionBytes == pubkeyD.propBytes
spendingSuccess || withdrawCondition
}
A skrypt budowy to:
{
val spendingSuccess = (pubkeyConstr1 || pubkeyConstr2 || pubkeyConstr3) && businessKey
val withdrawCondition = HEIGHT > 5000L &&
OUTPUTS(0).value >= 500L && OUTPUTS(0).propositionBytes == pubkeyA.propBytes &&
OUTPUTS(1).value >= 500L && OUTPUTS(1).propositionBytes == pubkeyB.propBytes &&
OUTPUTS(2).value >= 500L && OUTPUTS(2).propositionBytes == pubkeyC.propBytes &&
OUTPUTS(3).value >= 500L && OUTPUTS(3).propositionBytes == pubkeyD.propBytes
spendingSuccess || withdrawCondition
}
Teraz załóżmy, że federacja spółdzielni stworzyła monetę chronioną umową głosowania. Poniżej przedstawiono, jak przedsiębiorca może prowadzić swoją działalność:
- Utworzyć transakcję, która konsumuje monetę i tworzy co najmniej trzy monety, jedną z umową wydania sprzętu, drugą z umową wydania budowy, trzecią tworząc monetę chronioną przez klucz publiczny przedsiębiorcy.
- Wysłać transakcję do spółdzielni, czekać na transakcję z podpisanym progiem, która zostanie opublikowana w blockchainie.
- Rozważyć umowę z sprzedawcą sprzętu, współpodpisać transakcję wydania.
- Rozważyć umowę z budowniczym, współpodpisać transakcję wydania.
Przedsiębiorca może łatwo uciec, nie prowadząc żadnej działalności, ale nie więcej niż 3,000 Ergs. Można to naprawić, np. te pieniądze mogłyby być wydawane dopiero po numerze bloku 5,000, a przed tym czasem mogłyby być wycofane przez spółdzielnie. W przypadku wydatków na sprzęt i budowę przedsiębiorca współpracuje z niektórymi, przypuszczalnie już renomowanymi, firmami. W ten sposób inwestor zmniejsza swoje ryzyko.
Możesz znaleźć kod i przykładowe transakcje online. Proszę zauważyć, że mamy więcej przykładów złożonych schematów podpisów, umów wieloetapowych (z ujawnianiem ścieżek wykonania w trakcie, jak MAST w Bitcoinie, ale z dozwolonymi cyklami), wyroczni, crowdfunding itp. Proszę sprawdzić nasz repozytorium przykładów.
Share post
13 sierpnia 2025
12 maja 2025






