diff --git a/README.md b/README.md index 5a5c32e..a8265ef 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,13 @@ sources in text w/ formatting in markdown conventions ## 2023 -Wed April 26th, 2023 - [**Query the (Open) Ethereum Blockchain (Database) with Contract Services**](https://github.com/viennacrypto/viennacrypto.github.io/tree/master/ethers) - Using Strongly-Typed Application Binary Interfaces (ABIs) With ethers.js (v6) Via JSON-RPC @ Vienna.js +Wed April 26th, 2023 - [**Query the (Open) Ethereum Blockchain (Database) with Contract Services**](ethers.md) - Using Strongly-Typed Application Binary Interfaces (ABIs) With ethers.js (v6) Via JSON-RPC @ Vienna.js Tue March 28th, 2023 - [**Inside Ordinal Inscriptions - Turn the Blockchain Into A Database For Digital Artefacts**](https://github.com/pixelartexchange/ordinals.sandbox/tree/master/insideordinals) @ Technologieplauscherl LXXX (Linz, Austria) -Wed March 8th, 2023 - [**GoReleaser In Action - Deliver Go Binaries As Fast and Easily As Possible (For Windows, Mac, Linux & Co.) Via GitHub Actions (Workflow)**](https://github.com/pixelartexchange/artbase.server/tree/master/goreleaser) @ Vienna.go +Wed March 8th, 2023 - [**GoReleaser In Action - Deliver Go Binaries As Fast and Easily As Possible (For Windows, Mac, Linux & Co.) Via GitHub Actions (Workflow)**](goreleaser.md) @ Vienna.go @@ -42,46 +42,49 @@ https://github.com/cryptopunksnotdead/punkbase/tree/master/insidepunkbase) @ Sta ## 2019 -Wed May 15th, 2019 - [**JavaScript in 2019 - Teach Yourself Web Programming in ~24 Hours~ 10 Minutes**](https://github.com/geraldb/talks/blob/master/javascript2019.md) @ Inhouse (Private) +Wed May 15th, 2019 - [**JavaScript in 2019 - Teach Yourself Web Programming in ~24 Hours~ 10 Minutes**](javascript2019.md) @ Inhouse (Private) Tue April 30th, 2019 - -[**Contract Scripting for Everyone: (Hyperledger) Car Registration Sample - From Go Chaincode to (Secure) Ruby Contract Script**](https://github.com/geraldb/talks/blob/master/fabcar.md) -@ [Vienna Hyperledger Meetup](https://meetup.com/Hyperledger-Vienna/events/260252086) +[**Contract Scripting for Everyone: (Hyperledger) Car Registration Sample - From Go Chaincode to (Secure) Ruby Contract Script**](fabcar.md) +@ Vienna Hyperledger Meetup Thu April 4th, 2019 - -[**The State of Bool - Everything You Never Wanted to Know**](https://github.com/geraldb/talks/blob/master/bool.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) - +[**The State of Bool - Everything You Never Wanted to Know**](bool.md) +@ Vienna Ruby Meetup Tue March 12th, 2019 - -[**Contracts, Contracts, Contracts - Code Your Own (Crypto Blockchain) Contracts w/ Ruby (sruby), Universum & Co**](https://github.com/geraldb/talks/blob/master/contracts.md) -@ [Vienna Crypto Programming Meetup](https://viennacrypto.github.io) +[**Contracts, Contracts, Contracts - Code Your Own (Crypto Blockchain) Contracts w/ Ruby (sruby), Universum & Co**](contracts.md) +@ Vienna Crypto Programming Meetup + ## 2018 Thu October 18th, 2018 - -[**Mining for Gold Using the World's #1 and Most Popular Data Format**](https://github.com/geraldb/talks/blob/master/csv.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +[**Mining for Gold Using the World's #1 and Most Popular Data Format**](csv.md) +@ Vienna Ruby Meetup Wed June 20th, 2018 - -[**Stay Static - Build Static Websites w/ VuePress (and Text with Formatting Conventions in Markdown)**](https://github.com/geraldb/talks/blob/master/vuepress.md) -@ [Vienna Vue.js Meetup](https://meetup.com/Vue-js-Vienna/events/249255348) +[**Stay Static - Build Static Websites w/ VuePress (and Text with Formatting Conventions in Markdown)**](vuepress.md) +@ Vienna Vue.js Meetup + Wed April 11th, 2018 - -[**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in Go from Zero (Scratch)**](https://github.com/geraldb/talks/blob/master/blockchain_go.md) -@ [Vienna Go Meetup](https://meetup.com/vienna-go-Vienna-Go-User-Group/events/248920971) +[**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in Go from Zero (Scratch)**](blockchain_go.md) +@ Vienna Go Meetup + Tue March 13th, 2018 - -[**Blockchain vs (Hyper) Ledger -- Inside (Hyper) Ledger Lite - Add Transactions One Block at a Time and Balance the Accounts (Books)**](https://github.com/geraldb/talks/blob/master/hyperledger.md) -@ [Hyperledger Vienna](https://meetup.com/Hyperledger-Vienna/events/246847194) +[**Blockchain vs (Hyper) Ledger -- Inside (Hyper) Ledger Lite - Add Transactions One Block at a Time and Balance the Accounts (Books)**](hyperledger.md) +@ Hyperledger Vienna + +Mon March 12th, 2018 - [**Build (Online) Presentations / Talks (and Handout Notes) with (Structured) Text with Formatting in Markdown Markup Conventions and (Off-the-Shelf Open Free) Slide Design Themes (Reveal.js, Bespoke.js, Impress.js, Shower.js, S6, ...) and the Jekyll (Static) Website Compiler**](slideshow-s9.md) +@ Austria.TXT Meetup -Mon March 12th, 2018 - [**Build (Online) Presentations / Talks (and Handout Notes) with (Structured) Text with Formatting in Markdown Markup Conventions and (Off-the-Shelf Open Free) Slide Design Themes (Reveal.js, Bespoke.js, Impress.js, Shower.js, S6, ...) and the Jekyll (Static) Website Compiler**](https://github.com/geraldb/talks/blob/master/slideshow-s9.md) -@ [Austria.TXT Meetup](https://github.com/austriacodes/austria.txt) -Thu March 8th, 2018 - [**Build (Online) Books and Documentation with Markdown and Octobook Themes and the Jekyll (Static) Website Compiler - Incl. Yuki & Moto Press Bookshelf Case Study**](https://github.com/geraldb/talks/blob/master/octobook.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +Thu March 8th, 2018 - [**Build (Online) Books and Documentation with Markdown and Octobook Themes and the Jekyll (Static) Website Compiler - Incl. Yuki & Moto Press Bookshelf Case Study**](octobook.md) +@ Vienna Ruby Meetup @@ -89,21 +92,22 @@ Thu March 8th, 2018 - [**Build (Online) Books and Documentation with Markdown an ## 2017 -Thu December 7th, 2017 - [**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in Ruby from Zero (Scratch)**](https://github.com/geraldb/talks/blob/master/blockchain_ruby.md) • +Thu December 7th, 2017 - [**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in Ruby from Zero (Scratch)**](blockchain_ruby.md) • [(Slides)](http://slideshow-s9.github.io/demos/blockchain_ruby.html), [(Print)](http://slideshow-s9.github.io/demos/blockchain_ruby.pdf.html) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +@ Vienna Ruby Meetup Mon November 13rd, 2017 - [**Build Blazing Fast (Static) Websites with GraphQL (and Gatsby)**](gatsby2.md#whats-graphql) • [(Slides)](http://slideshow-s9.github.io/demos/gatsby2.html), [(Print)](http://slideshow-s9.github.io/demos/gatsby2.pdf.html) -@ [GraphQL Vienna Meetup](https://meetup.com/GraphQL-Vienna/events/243984437) +@ GraphQL Vienna Meetup Wed September 27th, 2017 - -[**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in JavaScript from Zero (Scratch)**](https://github.com/geraldb/talks/blob/master/blockchain.md) • +[**Blockchain! Blockchain! Blockchain! - Build Your Own Blockchains in JavaScript from Zero (Scratch)**](blockchain.md) • [(Slides)](http://slideshow-s9.github.io/demos/blockchain.html), [(Print)](http://slideshow-s9.github.io/demos/blockchain.pdf.html) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/236300243) +@ Vienna JavaScript Meetup + Wed September 20th, 2017 - [**Progressive Web Apps (PWAs) and Lighthouse - From Responsive to Mobile to Offline First Design**](progressive.md) @@ -111,33 +115,34 @@ Wed September 20th, 2017 - Thu September 14th, 2017 - [**JSON - What's Next for the No 1. Universal (Non-Binary/Human) Data Exchange Format**](jsonnext.md) -@ [Microservices Vienna Meetup](https://meetup.com/microservices-vienna/events/241960207) +@ Microservices Vienna Meetup Tue September 5th, 2017 - [**Gastsby 1.0 - Build Single-Page Static Websites in React w/ Gatsby and GraphQL**](gatsby2.md) -@ [React (JavaScript) Vienna Meetup](https://meetup.com/ReactVienna/events/242821292) +@ React (JavaScript) Vienna Meetup Tue July 4th, 2017 - [**Quik - The Missing Project Scaffolder for Ruby - Quick Start Your Ruby Gems, Your Sinatra Apps, Your Jekyll Sites 'n' More**](quik.md) -@ [Ruby Linz Meetup](https://meetup.com/Ruby-User-Group-Linz-RUGL/events/240388912) +@ Ruby Linz Meetup Thu June 8th, 2017 - [**Meet Jason Feed - The New Web Feed & Syndication Guy (Ruby Edition)**](webfeeds2.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +@ Vienna Ruby Meetup Wed May 31st, 2017 - [**Meet Jason Feed - The New Web Feed & Syndication Guy (JavaScript Edition)**](jsonfeed.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/236300238) +@ Vienna JavaScript Meetup Wed May 17th, 2017 - [**Building Static Websites with Jigsaw 'n' Blade (in PHP)**](jigsaw.md) -@ [Laravel (PHP) Vienna Meetup](https://meetup.com/Laravel-Frameworkers-Vienna/events/237725787) +@ Laravel (PHP) Vienna Meetup + Fri May 5th, 2017 - [**The World Factbook - Explore the World with Free Open Public Domain Datasets**](factbook.md) -@ [Linuxwochen Wien '17](http://www.linuxwochen.at/Wien) +@ Linuxwochen Wien '17 Free Open Public Domain Data :: 250+ Country Profiles (Incl. Flags 'n' Maps) @@ -156,7 +161,7 @@ Wed April 19th, 2017 - Thu April 6th, 2017 - [**New Horizons - Build Your Own (Static) Planet News Site with Pluto (and Ruby)**](planet.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +@ Vienna Ruby Meetup The talk covers how to read web feeds in ruby w/ the standard rss module and 3rd party libraries such as the universal feedparser gem and @@ -170,11 +175,12 @@ wrap up discussing the future of planet ruby. Wed March 29th, 2017 - [**factbook.json - How to model the world with JavaScript**](factbook.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/230066469) +@ Vienna JavaScript Meetup Wed March 15th, 2017 - [**Jekyll vs Middleman - Build static websites with Ruby**](jekyll_vs_middleman.md) -@ [Ruby Linz Meetup](https://meetup.com/Ruby-User-Group-Linz-RUGL/events/237342046) +@ Ruby Linz Meetup + ## 2016 @@ -182,34 +188,36 @@ Wed March 15th, 2017 - Thu November 17th, 2016 - Part I) [**factbook.json - Turn the World Factbook into Open (Structured) Data**](factbook.md) Part II) [**factbook.json - Using Git (and GitHub) for (Publishing) Data**](git_for_data.md) -@ [Vienna Open Data Meetup](https://meetup.com/Open-Knowledge-Oesterreich/events/233208866) +@ Vienna Open Data Meetup Thu September 22nd, 2016 - [**Building Static Websites with Jigsaw 'n' Blade (in PHP)**](jigsaw.md) -@ [Vienna PHP Meetup](https://meetup.com/viennaphp/events/232763541) +@ Vienna PHP Meetup Wed August 31rd, 2016 - [**Building static websites with the Great Gatsby and React.js web components**](gatsby.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/230515294) +@ Vienna JavaScript Meetup + Thu August 11th, 2016 - Part I) [**Building static websites with Metalsmith**](metalsmith2.md) Part II) [**Building static websites with Gatsby**](gatsby.md) -@ [Stahlstadt JavaScript Linz Meetup](https://meetup.com/stahlstadt-js/events/232729094) +@ Stahlstadt JavaScript Linz Meetup Wed July 20th, 2016 - [**The New New JavaScript / ECMAScript (ES6, ES7, ES8)**](es6.md) @ Inhouse (Private) Wed July 13rd, 2016 - [**Stay Static - Build Single-Page Websites with the Great Gatsby**](gatsby.md) -@ [React (JavaScript) Vienna Meetup](https://meetup.com/ReactVienna/events/232438531) +@ React (JavaScript) Vienna Meetup Thu June 9th, 2016 - [**Stay Static - Build Static Websites with Hugo and the Go Template Language**](gohugo.md) -@ [Vienna Go Meetup](https://meetup.com/Vienna-Golang-Meetup/events/230458823) +@ Vienna Go Meetup -Sat April 30th, 2016 @ [Linuxwochen Wien '16](http://www.linuxwochen.at/Wien) + +Sat April 30th, 2016 @ Linuxwochen Wien '16 I) [**The New HTML - Markdown - Use Plain Text for Websites, Presentations and Books**](markdown.md) @@ -226,11 +234,12 @@ In 2016 you can get pretty far with just HTML, JS and CSS. The talk shows how to Tue March 8th, 2016 - [**Building Static Websites with Metalsmith (+Handelbars/Nunjucks)**](metalsmith2.md) -@ [Node (JavaScript) Vienna Meetup](https://meetup.com/nodejs-vienna/events/228638709) +@ Node (JavaScript) Vienna Meetup + Thu March 3rd, 2016 - [**Stay Static - Jekyll vs. Middleman - Build Static Websites with Ruby**](jekyll_vs_middleman.md) -@ [Vienna Ruby Meetup](https://viennarb.github.io) +@ Vienna Ruby Meetup Wed March 2nd, 2016 - @@ -241,13 +250,14 @@ Wed March 2nd, 2016 - Thu October 15, 2015 - [**Dr. Jekyll and Mr. Hyde: The Missing Theme Package Manager & Quick Start Script Wizard**](drjekyll.md) -@ [Vienna Ruby Meetup](https://meetup.com/vienna-rb/events/225097350) +@ Vienna Ruby Meetup Wed September 30, 2015 - [**Add (Deep) Anchor Links to Your Website**](anchor.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/220339170) +@ Vienna JavaScript Meetup + -Fri May 8th, 2015 @ [Linuxwochen Wien '15](http://www.linuxwochen.at/Wien) +Fri May 8th, 2015 @ Linuxwochen Wien '15 I) **Building Websites, Blogs, Books w/ Static Site Generators** @@ -277,11 +287,11 @@ Join to learn more and discuss the state of open data with a focus on practical Wed August 27th, 2014 - [**Building Your Own Web Components (Tags / Elements)**](webcomponents2.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/135052012) +@ Vienna JavaScript Meetup -Sat May 10th, 2014 @ [Linuxwochen Wien '14](http://www.linuxwochen.at/Wien) +Sat May 10th, 2014 @ Linuxwochen Wien '14 I) **Use Markdown for Websites, Presentations and Books** @@ -298,7 +308,7 @@ What's the state of open data for the World Cup? And football in general? What o Wed April 30th, 2014 - [**Using Open Football Data - Get Ready for the World Cup in Brazil w/ JavaScript**](open_data_world_cup_with_js.md) -@ [Vienna JavaScript Meetup](https://meetup.com/viennajs/events/126159362) +@ Vienna JavaScript Meetup @@ -308,7 +318,7 @@ Mon Oct 7th, 2013 - [**(J)Ruby in Action - Web Apps w/ Rails 'n' Jetty"**](jruby_web_apps.md) @ Java Austria -Fri May 3rd, 2013 @ [Linuxwochen Wien '13](http://www.linuxwochen.at/Wien) +Fri May 3rd, 2013 @ Linuxwochen Wien '13 **football.db - Using Open Football Data** diff --git a/ethers.md b/ethers.md new file mode 100644 index 0000000..d6da081 --- /dev/null +++ b/ethers.md @@ -0,0 +1,940 @@ +# Query the (Open) Ethereum Blockchain (Database) with Contract Services + +using strongly-typed application binary interfaces (ABIs) with ethers.js (v6) via JSON-RPC + + + +Abstract: + +I am a no-coiner (HODLing 0 ethers) and a (big) fan of open data / transactions / art. +There's lot of misunderstandings of blockchains and crypto - +this talk shows how you can use the ethers.js library to query ("on-chain") +contract services on ethereum (for free). + +The ABI (application binary interface) - "serialized" in JSON - for contract services +is kind of emerging as a new (open) standard / spec for (yes, strongly-typed) apis +(that you can use in any programming language incl. - of course - javascript). +Learn the difference between "on-chain" and "off-chain" tokens +or how to query for "on-chain" (generative) art and much more. + + + + +## Ethers.js v5 vs v6? What's News? + +> Big Numbers +> +> One of the biggest changes in v6 is that the BigNumber +> class has been replaced with the built-in ES2020 BigInt +> offered by modern JavaScript environments. +> +> There is plenty of online documentation to get you started with JavaScript ES2020 BigInt. +> Keep in mind, just like BigNumber, a ES2020 BigInt can only operate on integers. + + + +## Numbers in JavaScript + +No Integer! All Numbers are (64-Bit) Double Precision Floating Point Numbers +(w/ 52 bits to represent the mantissa) + + +![](i/double-precision-number.png) + +(Source: [Double-precision floating-point format @ Wikipedia](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)) + + + +Max (biggest) integers safely to represent between `-(2^53 – 1)` and `2^53 – 1` + + +``` js +Number.MAX_SAFE_INTEGER +//=> 9007199254740991 + +2**53-1 +//=> 9007199254740991 +``` + + + +## Money, Money, Money + + +Best Practice - Use Integers Only (For Calculations) + +Euro 5.99 change to 599 cents + +1 Euro == 100 Cents (10^2) + + + +Triva Quiz + +Bitcoin 5.99 change to ___ sat(oshis) + +Ether 5.99 change to __ wei + +- 1 Bitcoin == ____ Sat(oshis) (10^ __ ) +- 1 Ether == ____ Wei (10^ __ ) + +
+Answer + 5990000000000000000n +``` + +
+ + + + +## Before BigInt + +``` js +10**18 +//=> 1000000000000000000 + +(10**18)+1 // or (10**18)+2 ... +//=> 1000000000000000000 - FAIL!! +``` + +Notice the suffix n (for BigInt) + +``` js +(10n**18n)+1n +//=> 1000000000000000001n - SUCCESS!! +``` + +Note: You CANNOT mix & match numbers and bigint in calculations - bigint calculations only work with bigints. +e.g. `(10n**18)+1` +Otherwise you get: + +> Error: Cannot mix BigInt and other types, use explicit conversions + + +However, you CAN compare numbers and bigints as usual: + +``` js +1n < 2; // true +2n > 1; // true +2 > 2; // false +2n > 2; // false +2n >= 2; // true +``` + +Beware - about strictly vs loosly equal number and bigints: + +``` js +0n === 0; // false +1n === 1; // false + +0n == 0; // true +1n == 1; // true +``` + + +Bigint "Convenience" Helper Functions - works with Number, String, Hex, Octal & Bin + + +``` js +const hugeNum = BigInt(9007199254740991); +//=> 9007199254740991n +``` +Note: Number - remember - only up-to Number.MAX_INTEGER! that is 9007199254740991 (2^53-1) + + +``` js +const hugeString = BigInt("9007199254740991"); +//=> 9007199254740991n + +const hugeHex = BigInt("0x1fffffffffffff"); +//=> 9007199254740991n + +const hugeOctal = BigInt("0o377777777777777777"); +//=> 9007199254740991n + +const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111"); +//=> 9007199254740991n +``` + +or use literals + +``` js +const hugeHex = 0x1fffffffffffffn; +//=> 9007199254740991n + +const hugeOctal = 0o377777777777777777n; +//=> 9007199254740991n + +const hugeBin = 0b11111111111111111111111111111111111111111111111111111n; +//=> 9007199254740991n +``` + + + +## BigInt - Can I Use? + +BigInt added in ES2020 (ES11) + +![](i/bigint-compat.png) + + +Or see + + + +## The "Magic" of Private/Public Key Cryptography is Big Integer Numbers + +How Big (in Bits) Is Safe & Secure For Elliptic Curve Cryptography (ECC)? + + +Triva Quiz - Private Keys (in Bitcoin, Ethereum, etc.) Are Big Integer Numbers - Q: How Big? + +- (A) 128-Bit +- (B) 256-Bit +- (C) 512-Bit +- (D) 1024-Bit +- __ Other, Please Tell + + + +``` js +2n**256n-1n +//=> 115792089237316195423570985008687907853269984665640564039457584007913129639935n + +// as hexstring (64 chars) +0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn // or +BigInt( "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ) +//=> 115792089237316195423570985008687907853269984665640564039457584007913129639935n +``` + + +If you ask - How big (or how safe) is a (random) 256-bit / 32 byte integer number? + +- How many sand grains on the beach? +- How many sand grains on earth? +- How many atoms in the universe? + +Yes, 256-bit is that big - there aren't enough atoms in the universe (squared). + + + +Aside - Elliptic What? + +> Elliptic-curve cryptography (ECC) is an approach to public-key cryptography +> based on the algebraic structure of elliptic curves over finite fields. +> +> (Source: [Elliptic-curve cryptography @ Wikipedia](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)) + + +Why not "classic" and "military-grade" RSA (Rivest–Shamir–Adleman) public-key cryptography? +How big (in bits) is safe? + +> RSA keys are typically 1024 to 4096 bits long. +> In 2003, RSA Security estimated that 1024-bit keys were likely to become crackable by 2010. +> As of 2020, it is not known whether such keys can be cracked, +> but minimum recommendations have moved to at least 2048 bits. +> It is generally presumed that RSA is secure if n is sufficiently large, +> outside of quantum computing. +> +> (Source: [RSA cryptosystem @ Wikipedia](https://en.wikipedia.org/wiki/RSA_(cryptosystem))) + + + + +## ethers.js Uses Noble Crypto(graphy) JS Libraries by Paul Milller + +Article - Learning fast elliptic-curve cryptography (ECC) [in JavaScript/TypeScript with BigInts] +see + +Live Demo - Elliptic curve (point) calculator +see + + +--- + + + + +## Getting Started w/ ethers.js + + + + +## History - Programming Ethereum (or is it Web 3.0?) with JavaScript API + + +web3.js - First (and original) library - still available (and in use) - see + +ethers.js - New (cool) kid in town by [Richard Moore](https://github.com/ricmoo) (Toronto, Canada) - "One-Man Show" + + + + + +## ethers.js - The official project summary / readme blurb + + +> A complete, compact and simple library for Ethereum and ilk, written in TypeScript. +> +> **Features** +> +> - Keep your private keys in your client, **safe** and sound +> - Import and export **JSON wallets** +> - Import and export BIP 39 **mnemonic phrases** (12 word backup phrases) and **HD Wallets** (English as well as Czech, French, Italian, Japanese, Korean, Simplified Chinese, Spanish, Traditional Chinese) +> - Meta-classes create JavaScript objects from any contract ABI, including **ABIv2** and **Human-Readable ABI** +> - Connect to Ethereum nodes over [JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC), [INFURA](https://infura.io), [Etherscan](https://etherscan.io), [Alchemy](https://alchemyapi.io), [Ankr](https://ankr.com) or [MetaMask](https://metamask.io) +> - **ENS names** are first-class citizens; they can be used anywhere an Ethereum addresses can be used +> - **Tiny** (~120kb compressed; 400kb uncompressed) +> - **Tree-shaking** focused; include only what you need during bundling +> - **Complete** functionality for all your Ethereum desires +> - Extensive [documentation](https://docs.ethers.org/v6/) +> - Large collection of **test cases** which are maintained and added to +> - Fully written in **TypeScript**, with strict types for security +> - **MIT License** (including ALL dependencies); completely open source to do with as you please +> +> (Source: [ethers-io/ethers.js @ GitHub](https://github.com/ethers-io/ethers.js)) + + + +## ethers.js - Getting Started w/ Node.js + +``` +$ npm install ethers +$ npm ls --all + +`-- ethers@6.3.0 + +-- @adraffy/ens-normalize@1.9.0 + +-- @noble/hashes@1.1.2 + +-- @noble/secp256k1@1.7.1 + +-- aes-js@4.0.0-beta.3 + +-- tslib@2.4.0 + `-- ws@8.5.0 + +-- UNMET OPTIONAL DEPENDENCY bufferutil@^4.0.1 + `-- UNMET OPTIONAL DEPENDENCY utf-8-validate@^5.0.2 +``` + + + + +## Query for Token Contract Basics + +- name +- symbol +- totalSupply + +using + + +``` +function name() view returns (string) +function symbol() view returns (string) +function totalSupply() view returns (uint256) +``` + + + + +## Query for Token Contract Basics (Cont.) + +No ethereum accounts (or ether) needed for read-only (query) contract access. + +All data is public (incl. data declared "private" in code). + +All contract functions / methods are always strongly-typed. + +AND require / follow an application binary interface +(for data encoding/decoding - big endian vs little endian etc.). + + + + +## Token Basics - Via JSON-RPC Using ethers.js + + +``` js +import { ethers } from "ethers"; // Import everything + +console.log( `Hello, ethers.js ${ethers.version}!` ); +//=> Hello, ethers.js 6.3.0! + +const provider = new ethers.JsonRpcProvider( "https://mainnet.infura.io/v3/" ); +``` + +**Blockchain JSON-RPC Provider Options** + +Option 1) +You can run your own local (ethereum) blockchain node (e.g. geth). + +Option 2) +Easier to get started with third-party provider +e.g. Infura, Alchemy, QuickNode, and many more. + +Requires (free) sign-up for API key. + + + + +## Contract №1 - Token Basics - Via JSON-RPC Using ethers.js (Cont.) + + +``` js +const abi = [ + "function name() view returns (string)", + "function symbol() view returns (string)", + "function totalSupply() view returns (uint256)", +]; + +const addr = '0x06012c8cf97bead5deae237070f9587f8e7a266d'; + +// Create a contract +const contract = new ethers.Contract( addr, abi, provider); + +const name = await contract.name(); +//=> CryptoKitties +const sym = await contract.symbol(); +//=> CK +const total = await contract.totalSupply(); +//=> 2022592n +``` + + + +**Q: What about (cryptokitties) token metadata (& image)?** + +A: It's still early ;-). SOON! +In theory, yes. KittBase contract incl. `function tokenMetadata(uint256 tokenId) view returns (string)` +In practice, the metadata contract (reference) is set to null address (0x0000000000000000000000000000000000000000). + +"Social" consensus ;-). Use: +- . +- +- ... +- + +resulting in: + +``` json +{"id":1, + "name":"Genesis", + "generation":0, + "genes":"626837621154801616088980922659877168609154386318304496692374110716999053", + "created_at":"2017-11-23T06:19:59.000Z", + "birthday":"2017-11-23T00:00:00.000Z", + "image_url":"https://img.cryptokitties.co/0x06012c8cf97bead5deae237070f9587f8e7a266d/1.png", + "image_url_cdn":"https://img.cn.cryptokitties.co/0x06012c8cf97bead5deae237070f9587f8e7a266d/1.png", + ... +} +``` + +![](i/kitty1.png) + + + +A classic crypto fraud - "own your kitties 100% forever!" - yeah, sure + + +reality - you do NOT own the kitty/cat image +and the metadata (& image) is "off-chain" and hosted on a classic "central" company web server. +What you "own" is the token (and the "on-chain" genes/dna - a 256-bit integer) +that you can sell to greater fools for (fun &) profit! + +Read the (hidden) fineprint - from the CryptoKitties License F.A.Q: + +> Dapper Labs, Inc. created [and owns] the art of your cryptokitty, +> and it's a big part of our brand. +> At the end of the day, businesses also need to have the right to make the big decisions [and the big $$$] about how the art gets used in a commercial setting. +> +> We reserve to ourselves the right to make bigger [and bigger] deals +> to help our business grow [and rake in all the $$$ for ourselves - of course]. +> +> [...] +> +> Q: What am I allowed to do with the art: +> +> - Use the Kitty art for your own personal, non-commercial use. +> +> Q: What am I NOT allowed to do with the art: +> +> - Modifying the art; +> - Using the art to market or sell products; +> - Trying to trademark your art, or otherwise acquire intellectual property rights in it. + + +=> "own your kitties 100% forever!" - the blockchain guarantees and says so ;-). + +Dapper Labs Inc. (Vancouver, Canada) - A Billion $$ Unicorn with "Blue-Chip" Venture Capital Investors & More + + + + + +## Contract №2 - "Off-Chain" Token Basics - Via JSON-RPC Using ethers.js + +Let's try another... add to abi ... + +- `function tokenURI(uint256 tokenId) view returns (string)` + +and let's query... Phree the Phunks ... + + + +``` js +const addr = '0xf07468ead8cf26c752c676e43c814fee9c8cf402'; + +const abi = [ + "function name() view returns (string)", + "function symbol() view returns (string)", + "function totalSupply() view returns (uint256)", + "function tokenURI(uint256 tokenId) view returns (string)", +]; + + +// Create a contract +const contract = new ethers.Contract( addr, abi, provider); + +const name = await contract.name(); +//=> CryptoPhunksV2 +const sym = await contract.symbol(); +//=> PHUNK +const total = await contract.totalSupply(); +//=> 10000n +``` + +**Q: What about token metadata (& image)?** + +Let's try... + + +``` js +const token0 = await contract.tokenURI( 0 ); +//=> ipfs://QmcfS3bYBErM2zo3dSRLbFzr2bvitAVJCMh5vmDf3N3B9X/0 + +const token1 = await contract.tokenURI( 1 ); +//=> ipfs://QmcfS3bYBErM2zo3dSRLbFzr2bvitAVJCMh5vmDf3N3B9X/1 + +... + +const token9999 = await contract.tokenURI( 9999 ); +//=> ipfs://QmcfS3bYBErM2zo3dSRLbFzr2bvitAVJCMh5vmDf3N3B9X/9999 +``` + +resulting in "off-chain" ipfs (InterPlanetary File System) links. + +Tip: Try an ipfs http gateway e.g. + +- +- +- ... +- + +resulting in: + +``` json +{"description":"Phunk #0", + "name":"Phunk #0", + "attributes":[{"trait_type":"Eyes","value":"Green Eye Shadow"}, + {"trait_type":"Ears","value":"Earring"}, + {"trait_type":"Hair","value":"Blonde Bob"}, + {"trait_type":"Sex","value":"Female"}], + "image_url":"https://gateway.pinata.cloud/ipfs/Qmazio5AkcBwNJByXHtbBk1hgnw4g1ADsYK369TSPLMqar/phunk0000.png"} +``` + + +![](i/phunk0.png) + + + + + +## (Blockchain) Contract Services - Strongly-Typed ABIs Available As JSON + +In theory you can write your blockchain contracts in any language. +In practice Solidity (JavaScript-like) is mostly used +and the definite (contract) ABI spec is + + + + +**From Solidity To (Contract) ABI JSON** + +The solc (solidity ompiler) generates / compiles the contract source(s) +into a binary [blob] AND the ABI in JSON e.g. + +``` json +{"type": "function", + "name": "name", + "constant": true, + "payable": false, + "stateMutability": "view", + "inputs": [], + "outputs":[{"name":"","type":"string"}] +}, +{"type": "function", + "name": "symbol", + "constant": true, + "payable": false, + "stateMutability": "view", + "inputs": [], + "outputs":[{"name":"","type":"string"}] +}, +{"type":"function", + "name":"totalSupply", + "constant":true, + "payable":false, + "stateMutability":"view", + "inputs":[], + "outputs":[{"name":"","type":"uint256"}] +}, +... +``` + +Great idea. Easy to read/parse (for computers) BUT gets big and unreadable very fast for humans. + +Tip: See [ABI-To-Sol](https://gnidan.github.io/abi-to-sol/) +to convert JSON ABIs back to "human" readable +"Solidity-like" interface headers. + + + + +## The "Human-Reabable" ABI Format + +Yes, introduced first in ethers.js +(and invented by Richard Moore back in 2018 - +see [ethers.js: Human-Readable Contract ABIs](https://blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917)). + +Human-readable, really? At least computer programmer-readable ;-). + + + +``` js +const abi = [ + "function name() view returns (string)", + "function symbol() view returns (string)", + "function totalSupply() view returns (uint256)", + "function tokenURI(uint256 tokenId) view returns (string)", + "function traitDetails(uint256 layerIndex, uint256 traitIndex) view returns (string name, string mimetype, bool hide)", + "function traitData(uint256 layerIndex, uint256 traitIndex) view returns (string)", +]; +``` + + + + +## Contract №3 - "On-Chain" Token Basics - Via JSON-RPC Using ethers.js + +Let's try another... Seize the memes of production... + +``` js +const addr = '0xe9b91d537c3aa5a3fa87275fbd2e4feaaed69bd0'; + +const abi = [ + "function name() view returns (string)", + "function symbol() view returns (string)", + "function totalSupply() view returns (uint256)", + "function tokenURI(uint256 tokenId) view returns (string)", + "function traitDetails(uint256 layerIndex, uint256 traitIndex) view returns (string name, string mimetype, bool hide)", + "function traitData(uint256 layerIndex, uint256 traitIndex) view returns (string)", +]; + + + +// Create a contract +const contract = new ethers.Contract( addr, abi, provider); + +const name = await contract.name(); +//=> Crypto Marcs +const sym = await contract.symbol(); +//=> MARCS +const total = await contract.totalSupply(); +//=> 5000n +``` + +**Q: What about token metadata (& image)?** + +Let's try... + +``` js +const token0 = await contract.tokenURI( 0 ); +``` + + +resulting in: + +``` +data:application/json;base64, +eyJuYW1lIjoiQ3J5cHRvIE1hcmNzICMwIiwiZGVzY3JpcHRpb24iOiJBIGNvbGxlY3Rpb24gb2YgNWs +gQ3J5cHRvTWFyY3MgZnVsbHkgT24tQ2hhaW4gLSBTZWl6aW5nIHRoZSBtZW1lcyBvZiBwcm9kdWN0aW +9uIiwic3ZnX2ltYWdlX2RhdGEiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSM +GFEMGlNVEl3TUNJZ2FHVnBaMmgwUFNJeE1qQXdJaUIyYVdWM1FtOTRQU0l3SURBZ01USXdNQ0F4TWpB +d0lpQjJaWEp6YVc5dVBTSXhMaklpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TUR +Bd0wzTjJaeUlnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZkSEpoYm5Od1lYSmxiblE3WW +1GamEyZHliM1Z1WkMxcGJXRm5aVHAxY213b1pHRjBZVHBwYldGblpTOXdibWM3WW1GelpUWTBMR2xXU +Ws5U2R6QkxSMmR2UVVGQlFVNVRWV2hGVldkQlFVRkNaMEZCUVVGWlEwRlpRVUZCUkdka2VqTTBRVUZC +UVVOWVFrbFhXRTFCUVVGelZFRkJRVXhGZDBWQmJYQjNXVUZCUVVGS2EyeEZVVlpTU1dsbE0wNU5VVVZ +CUVVGcVJFMU5ReTgxTWtWRGRteFNRVEF3Ym5Gek0yMDVRWGRCUVVGQlFVRkJTbmt4UXpkdlJFeGtaSG +[...] +dmiOiJTcG90cyJ9LHsidHJhaXRfdHlwZSI6Ik1hcmMgVHlwZSIsInZhbHVlIjoiTWFyYyA0In1dfQ== +``` + + +let's base64 decode - resulting in: + +``` json +{"name":"Crypto Marcs #0", + "description":"A collection of 5k CryptoMarcs fully On-Chain - Seizing the memes of production", + "svg_image_data":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwMCI...", + "image_data":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSI...", + "attributes":[{"trait_type":"1/1","value":"Original"}, + {"trait_type":"Mouth","value":"Marc"}, + {"trait_type":"Eyes","value":"Marc"}, + {"trait_type":"Lips","value":"Marc"}, + {"trait_type":"Facial Hair","value":"Marc"}, + {"trait_type":"Head","value":"Bandana"}, + {"trait_type":"Neck","value":"Grey Shirt"}, + {"trait_type":"Nose","value":"Marc"}, + {"trait_type":"Ear","value":"Marc"}, + {"trait_type":"Emotion","value":"Marc"}, + {"trait_type":"Face","value":"Spots"}, + {"trait_type":"Marc Type","value":"Marc 4"}]} +``` + +and let's base64 decode the svg_image_data ;-) - resulting in: + +``` xml + + +``` + + + +![](i/marc0.svg) + + + + +## Contract №3 - Let's seize the memes of production ;-). + + +Let's get (query for) all generative art (image) blocks and names... +If the contract uses / supports: + +- `function traitDetails(uint256 layerIndex, uint256 traitIndex) view returns (string name, string mimetype, bool hide)` and +- `function traitData(uint256 layerIndex, uint256 traitIndex) view returns (string)` + +than you can "auto-magically" download all "on-chain" layers, +that is, all metadata triplets by repeatedly calling `traitDetails` starting +with index `0/0`, `0/1`, ..., `1/0`, `1/1`, ... and so on e.g. + +- `traitDetails( 0, 0 )` => `["Zombie", "image/png", false]` +- `traitDetails( 0, 1 )` => `["Cline", "image/png", false]` +- ... +- `traitDetails( 1, 0 )` => `["Bubble Gum", "image/png", false]` +- `traitDetails( 2, 1 )` => `["Medical Mask", "image/png", false]` +- ... + +resulting in 171 Attributes (incl. Nones) in 11 Categories (plus 1/1s): + +``` +id, category, name +0, 1/1, Zombie +1, 1/1, Cline +2, 1/1, Pauly Devil +3, 1/1, Deal With It Devil +4, 1/1, Marc +5, 1/1, Gold +6, 1/1, Marcdonalds +7, 1/1, Marc (2) +8, 1/1, Devil +9, 1/1, Marc (3) +10, 1/1, Madlad Marc +11, 1/1, Chad +12, 1/1, Ape +13, 1/1, Claudia Bot +14, 1/1, Marc (4) +15, 1/1, Bot +16, 1/1, Marc (5) +17, 1/1, Marc (6) +18, 1/1, Alien +19, 1/1, Claudia Gold +20, 1/1, Marc (7) +21, 1/1, Original +22, Mouth, Bubble Gum +23, Mouth, Medical Mask +24, Mouth, Hookah +25, Mouth, Pipe +26, Mouth, Cigar +27, Mouth, Vape +28, Mouth, Cigarette +29, Mouth, None +30, Eyes, Tears +31, Eyes, Monocle +32, Eyes, Lasers +33, Eyes, Pink Shades +34, Eyes, Aviators +35, Eyes, Polarized White +36, Eyes, VR Headset +37, Eyes, Gold Glasses +38, Eyes, 3D Glasses +... +``` + + +and all images (as binary blobs) by calling `traitData` e.g. + +- `traitData( 0, 0 )` => `"\x89PNG..."` +- `traitData( 0, 1 )` => `"\x89PNG..."` +- ... + +and so on resulting in: + +![](i/marcs-spritesheet-24x24.png) + + + + +For many more real-world examples incl. Mad Camels, Ape Origins, Punkin Spicies, NFL, etc. +see the [**Art Factory Sandbox**](https://github.com/generativeartfactory/artfactory.sandbox). + + + + + +## Questions? Comments? + + +Thanks. + + +**What's ETH Vienna / Wien Meetup / Stammtisch?** + +The idea is to (re)start the Eth(erum) community in Vienna / Wien. + +Eth(ereum) Vienna Meetup(s) - Jour Fixe - Every First Wednesday of the Month. + +- **Wednesday, April 5th, 2023, 6-8pm - (Ethereum) Blockchain & Red Kriek Beer** +- **Wednesday, May 3rd, 2023, 6-8pm** +- **Wednesday, June 7th, 2023, 6-8pm** +- Summer Break + +@ Delirium Café Vienna, Passauer Platz 2, 1. District (Beside the Church - Maria am Gestade) + +Note: Everyone MUST pay for your own drink(s) and optional food. +For the menu & prices, see . For example - A traditional (on tap!) Belgian kriek lambic beer by Brouwerij F. Boon costs 0.15L €2.80 / 0.33L €4.80. + +Join us. See or . + + + + +--- + +## Bonus + +## What's the point of (Contract) ABIs? + +Spec(ification) of strongly-typed function calls (and function call data) +guarantees binary interop(eration). + +It is kind of emerging as a new (open) standard / spec for (yes, strongly-typed) apis +(that you can use in any programming language incl. - of course - javascript). + +Note: Ideally all (blockchain) contract code is open source (and "byte-by-byte" verified) +but in practice NOT all contract source code gets published. + + +Yes, "native" language is Solidity. + +Designed "like-JSON", that is, limited set of data types - works and fits into most programming languages. +See my own [abicoder (yes, v2-compatible) in ruby](https://github.com/rubycocos/blockchain/tree/master/abicoder) ;-). + +ABI v2 (yes, there's an update) incl. tuples (also known as structs) +and arrays of arrays or tuple of tuples or array of tuples and so on. + + + +## ABI Types + +The following elementary types are supported: + +- `uint`: unsigned integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`. e.g. `uint32`, `uint8`, `uint256`. +- `int`: two's complement signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`. +- `address`: equivalent to `uint160`, except for the assumed interpretation and language typing. + For computing the function selector, `address` is used. +- `bool`: equivalent to `uint8` restricted to the values 0 and 1. For computing the function selector, `bool` is used. +- `bytes`: binary type of `M` bytes, `0 < M <= 32`. + + +The following (fixed-size) array types are supported: + +- `[M]`: a fixed-length array of `M` elements, `M >= 0`, of the given type. + + +The following non-fixed-size types are supported: + +- `bytes`: dynamic sized byte sequence. +- `string`: dynamic sized unicode string assumed to be UTF-8 encoded. +- `[]`: a variable-length array of elements of the given type. + +Types can be combined to a tuple by enclosing them inside parentheses, separated by commas: + +- `(T1,T2,...,Tn)`: tuple consisting of the types `T1`, ..., `Tn`, `n >= 0` + +It is possible to form tuples of tuples, arrays of tuples and so on. + + + +## What's abigen? + +Using the abigen command-line tool +you can generate type-safe "wrapper" code for contracts from abis (in json) +for your language. + +Started with Go Lang (a statically compiled programming language) +but works practically with any language. +See my own [little abigen in ruby, that is, abi2ruby](https://github.com/rubycocos/blockchain/tree/master/abi2ruby) ;-) - +a python-like dynamic programming language. + + +Also used in JS for auto-documentation "in the real-world" +or - of course - for type-safe contracts in ... TypeScript - +see [ABI Type - Strict TypeScript types for Contract ABIs.](https://abitype.dev) +and many more. + + diff --git a/goreleaser.md b/goreleaser.md new file mode 100644 index 0000000..5715238 --- /dev/null +++ b/goreleaser.md @@ -0,0 +1,237 @@ +# GoReleaser Talk Notes + +- Vienna Go (Lang) Meetup March 2023 @ fiskaly + + + +## How-To Cross-Compile Go Programs for Window, Mac OS, and Linux + +Cross-Compile == Build Go Programs / Applications for Different Operation Systems (`GOOS`) and +(Processor) Architectures (`GOARCH`) e.g. build Mac OS on Windows or Windows on Linux etc. + + +Q: Cross-Compile!? + +> Programs written in Go can easily be compiled for a wide variety of target operating systems +> such as Windows, Mac OS, and Linux +> by using the `GOOS` and `GOARCH` environmental variables. + + +Q: What is GOOS and GOARCH? + +> `GOOS` refers to the operating system (Linux, Windows, BSD, etc.), +> while `GOARCH` refers to the (processor) architecture (386, amd64, arm64, etc.) to build for. + + +Q: How-to find out your GOOS and GOARCH values? + + $ go env GOOS + windows + $ go env GOARCH + amd64 + $ go env GOOS GOARCH + windows + amd64 + +or + + $ go env + +resulting in (sorted a-z): + + .. + set GOARCH=amd64 + ... + set GOOS=windows + ... + + or + + $ go version + go version go1.18 windows/amd64 + + +Q: What values for GOOS and GOARCH possible? + + $ go tool dist list + +resulting in: + +``` +aix/ppc64 +android/386 +android/amd64 +android/arm +android/arm64 +darwin/amd64 +darwin/arm64 +dragonfly/amd64 +freebsd/386 +freebsd/amd64 +freebsd/arm +freebsd/arm64 +illumos/amd64 +ios/amd64 +ios/arm64 +js/wasm +linux/386 +linux/amd64 +linux/arm +linux/arm64 +linux/mips +linux/mips64 +linux/mips64le +linux/mipsle +linux/ppc64 +linux/ppc64le +linux/riscv64 +linux/s390x +netbsd/386 +netbsd/amd64 +netbsd/arm +netbsd/arm64 +openbsd/386 +openbsd/amd64 +openbsd/arm +openbsd/arm64 +openbsd/mips64 +plan9/386 +plan9/amd64 +plan9/arm +solaris/amd64 +windows/386 +windows/amd64 +windows/arm +windows/arm64 +``` + + + +Coding Example - hello.go: + +``` go +package main + +import( + "fmt" + "runtime" +) + +func main() { + fmt.Printf( "OS: %s\nArchitecture: %s\n", + runtime.GOOS, + runtime.GOARCH) +} +``` + +build (64-bit binary) + + $ go build hello.go + +run + + $ hello + OS: windows + Architecture: amd64 + +build (32-bit binary) + + $ set GOOS=windows + $ set GOARCH=386 + $ go build hello.go + +run + + $ hello + OS: windows + Architecture: 386 + +build (linux binary on windows) + + $ set GOOS=linux + $ set GOARCH=386 + $ go build hello.go + +run + + $ hello + + > This version of hello is not compatible with the version of Windows you're running. + > Check your computer's system information and then contact the software publisher. + + +Note: You CAN run the the binary / executable +only on the target platform (e.g. on Window, Linux, Mac OS, etc.) - +out the other end only runs on OS X, and cannot be run on + + +Cross-compile in unix shell: + + $ GOOS=linux GOARCH=386 go build hello.go + + $ GOOS=darwin GOARCH=arm64 go build hello.go + .. + + +## Artbase Server Binary Case Study + +see + + +Download Releases (Binaries) On Github + +see + +Example: + +- `artbase_1.0.0_linux_64bit.tar.gz` - 2.84 MB +- `artbase_1.0.0_linux_armv6.tar.gz` - 2.66 MB +- `artbase_1.0.0_macos_64bit.tar.gz` - 2.93 MB +- `artbase_1.0.0_macos_arm64.tar.gz` - 2.82 MB +- `artbase_1.0.0_windows_64bit.zip` - 2.82 MB + + + +Automate, Automate, Automate + +via GitHub Actions & GoReleaser + +GoReleaser (Freemium with Pro version) - +Release Go projects as fast and easily as possible! + +see + + +How-To Use + +Step 1: .gorealser.yml Configuration + +see + + + +Step 2: .github/workflows/release_build.yml (Git Action / Workflow Configuration) + +see + + +Step 3: git tag (triggers goreleaser) + +see + + $ git tag v0.0.5 + $ git tag v1.0.0 + +only "local" - to trigger goreleaser push tags to github (upstream) + + $ git push origin --tags + or + $ git push origin v0.0.5 + $ git push origin v1.0.0 + + + +That's it. + +## Questions? Comments? + diff --git a/i/bigint-compat.png b/i/bigint-compat.png new file mode 100644 index 0000000..4f453c2 Binary files /dev/null and b/i/bigint-compat.png differ diff --git a/i/double-precision-number.png b/i/double-precision-number.png new file mode 100644 index 0000000..71a01f8 Binary files /dev/null and b/i/double-precision-number.png differ diff --git a/i/kitty1.png b/i/kitty1.png new file mode 100644 index 0000000..f69f16f Binary files /dev/null and b/i/kitty1.png differ diff --git a/i/marc0.svg b/i/marc0.svg new file mode 100644 index 0000000..e37ec99 --- /dev/null +++ b/i/marc0.svg @@ -0,0 +1,22 @@ + + diff --git a/i/marcs-spritesheet-24x24.png b/i/marcs-spritesheet-24x24.png new file mode 100644 index 0000000..e28438e Binary files /dev/null and b/i/marcs-spritesheet-24x24.png differ diff --git a/i/phunk0.png b/i/phunk0.png new file mode 100644 index 0000000..4c5a563 Binary files /dev/null and b/i/phunk0.png differ