[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-1-evm-code-jikkou-opcode-stack-gas":3},{"article":4,"author":54},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":34,"related_articles":35},"d4000000-0000-0000-0000-000000000101","a0000000-0000-0000-0000-000000000042","Deep EVM #1：EVMがコードを実行する仕組み — オペコード、スタック、ガス","deep-evm-1-evm-code-jikkou-opcode-stack-gas","Ethereum Virtual Machineの低レベルウォークスルー：オペコードがスタックをどう操作するか、ガスメータリングの仕組み、トランザクション実行時に何が起こるか。","## EVMはスタックマシンである\n\nEthereum Virtual Machineは、ラップトップのx86プロセッサとは全く異なります。レジスタがありません。代わりに、各要素が256ビット（32バイト）のワードである1024要素のスタックにプッシュまたはポップする**スタックマシン**です。\n\nスマートコントラクトを呼び出すと、EVMはコントラクトのバイトコード — 単一バイトのオペコードのフラットなシーケンス — を受け取り、バイト0から実行を開始します。関数テーブルも、ELFヘッダーも、リンクステップもありません。バイトコードがプログラムです。\n\n```\n\u002F\u002F Solidity:\n\u002F\u002F uint256 result = 2 + 3;\n\n\u002F\u002F バイトコードにコンパイル：\n\u002F\u002F PUSH1 0x02  PUSH1 0x03  ADD\n\n\u002F\u002F スタックトレース：\n\u002F\u002F []           -> PUSH1 0x02 -> [2]\n\u002F\u002F [2]          -> PUSH1 0x03 -> [2, 3]\n\u002F\u002F [2, 3]       -> ADD        -> [5]\n```\n\nすべてのオペコードはスタックの上部からオペランドを消費し、結果をプッシュバックします。ADDオペコードは2つの値をポップし、加算し、合計をプッシュします。\n\n## オペコードカテゴリ\n\nEVMは約140のオペコードを定義し、機能カテゴリにグループ化されています：\n\n### 算術と比較\n- **ADD、SUB、MUL、DIV、MOD** — 基本的な256ビット整数演算。すべて3ガス（G_verylow階層）。\n- **SDIV、SMOD** — 2の補数を使用した符号付き除算と剰余。\n- **ADDMOD、MULMOD** — モジュラー演算：単一のオペコードで`(a + b) % N`と`(a * b) % N`。楕円曲線演算に不可欠で、8ガス。\n- **EXP** — べき乗。10ガス + 指数のバイトあたり50、最も高価な算術オペコードの1つ。\n- **LT、GT、SLT、SGT、EQ、ISZERO** — 1（true）または0（false）をプッシュする比較オペコード。\n\n### ビット演算\n- **AND、OR、XOR、NOT** — ビット論理、各3ガス。\n- **SHL、SHR、SAR** — 左シフト、論理右シフト、算術右シフト（Constantinople、EIP-145で追加）。\n- **BYTE** — 32バイトワードから単一バイトを抽出。\n\n### スタック操作\n- **POP** — 先頭要素を破棄。\n- **PUSH1〜PUSH32** — 1〜32バイトの即値データをスタックにプッシュ。\n- **DUP1〜DUP16** — N番目のスタック要素を先頭に複製。\n- **SWAP1〜SWAP16** — 先頭要素をN番目の要素と交換。\n\n## ガススケジュール\n\nすべてのオペコードにはガスコストがあります。ガスは2つの目的を果たします：無限ループの防止（停止問題）と計算リソースの公正な価格設定です。\n\n| 階層 | ガス | 例 |\n|------|------|----|\n| Zero | 0 | STOP、RETURN、REVERT |\n| Base | 2 | ADDRESS、ORIGIN、CALLER |\n| Very Low | 3 | ADD、SUB、LT、GT、AND、OR、POP |\n| Low | 5 | MUL、DIV、MOD |\n| Mid | 8 | ADDMOD、MULMOD、JUMP |\n| High | 10 | JUMPI |\n| Special | 可変 | SLOAD、SSTORE、CALL、CREATE |\n\n高価なオペコードは状態にアクセスするものです：\n\n```\n\u002F\u002F 状態アクセスのガスコスト（EIP-2929以降）：\n\u002F\u002F SLOAD（コールド）：2100ガス\n\u002F\u002F SLOAD（ウォーム）：100ガス\n\u002F\u002F SSTORE（コールド、0→非ゼロ）：22100ガス\n\u002F\u002F SSTORE（ウォーム）：100ガス（+ 0→非ゼロの場合20000）\n\u002F\u002F CALL（コールド）：2600ガス\n\u002F\u002F CALL（ウォーム）：100ガス\n```\n\n## コールド vs ウォームアクセス（EIP-2929）\n\nEIP-2929（ベルリンアップグレード、2021年4月）は、**アクセスリスト**の概念を導入しました — トランザクション内でアクセスされたアドレスとストレージスロットのセットです。\n\nトランザクション内で初めてストレージスロットまたは外部アドレスにアクセスする場合、「コールド」となり追加のガスがかかります。同じアドレス\u002Fスロットへのその後のアクセスは「ウォーム」で安価です。ストレージスロットを読む順序がガス最適化に重要な理由がここにあります。\n\n## 実行フロー：トランザクションで何が起こるか\n\nコントラクトを呼び出すトランザクションを送信すると、以下の完全な実行シーケンスが発生します：\n\n1. **トランザクション検証** — ナンス確認、残高チェック、署名検証\n2. **固有ガス控除** — トランザクション自体に21000ガス、非ゼロcalldataバイトあたり16ガス、ゼロバイトあたり4ガス\n3. **コンテキストセットアップ** — EVMが実行コンテキストを作成\n4. **プログラムカウンタが0から開始** — EVMがposition 0のオペコードを読み取り実行\n5. **順次実行** — 各オペコードが実行され、ガスが控除される\n6. **終了** — STOP、RETURN、REVERT、またはガス切れで実行が終了\n7. **状態コミットまたはロールバック** — 成功時はすべての状態変更がコミット、リバート時はロールバック\n\n## プログラムカウンタとJUMP\n\nプログラムカウンタ（PC）はバイトコード内の現在位置を追跡する暗黙のレジスタです。2つのオペコードがPCを直接変更します：\n\n- **JUMP** — スタックからデスティネーションをポップし、PCをその値に設定。デスティネーションにはJUMPDESTオペコードが必要。\n- **JUMPI** — 条件付きジャンプ。デスティネーションと条件をポップ。条件が非ゼロならジャンプ。\n\nSolidityコンパイラは、calldataの最初の4バイトを読み込み、既知の関数シグネチャと比較し、一致するコードブロックにJUMPIする関数セレクタを生成します。\n\n## サブコール：CALL、STATICCALL、DELEGATECALL\n\nコントラクトは3つのコールオペコードで他のコントラクトを呼び出せます：\n\n- **CALL** — 標準コール。独自のスタックとメモリを持つ新しい実行コンテキストを作成。\n- **STATICCALL** — 読み取り専用コール（EIP-214）。呼び出し先での状態変更オペコードは即座にリバート。\n- **DELEGATECALL** — 呼び出し先のコードを呼び出し元のストレージコンテキストで実行。プロキシパターンの基盤。\n\n## MEVへの実践的影響\n\nMEVボットを構築している場合、オペコードレベルでのEVMの理解はオプションではなく、競争上の必要条件です。ボットの実行で節約されるすべてのガスユニットが利益マージンです。\n\n- **送信前にシミュレーション** — `eth_call`またはローカルEVM（revm、EVMONE）を使用\n- **コールドアクセスを最小化** — アクセスリスト（EIP-2930）でストレージスロットをプリウォーム\n- **読み取りにはSTATICCALLを使用** — わずかに安価で状態変更がないことを保証\n- **オペコードコストを把握** — 1つのミスプレースされたSLOADが2100ガスのコスト\n\n## まとめ\n\nEVMはそのシンプルさが美しい：256ビットワードのスタックマシン、フラットなバイトコードフォーマット、そしてすべての操作に価格をつけるガスメータリングシステム。この基盤 — オペコード、スタック、ガス — を理解することが、本シリーズで続くすべての前提条件です。","\u003Ch2 id=\"evm\">EVMはスタックマシンである\u003C\u002Fh2>\n\u003Cp>Ethereum Virtual Machineは、ラップトップのx86プロセッサとは全く異なります。レジスタがありません。代わりに、各要素が256ビット（32バイト）のワードである1024要素のスタックにプッシュまたはポップする\u003Cstrong>スタックマシン\u003C\u002Fstrong>です。\u003C\u002Fp>\n\u003Cp>スマートコントラクトを呼び出すと、EVMはコントラクトのバイトコード — 単一バイトのオペコードのフラットなシーケンス — を受け取り、バイト0から実行を開始します。関数テーブルも、ELFヘッダーも、リンクステップもありません。バイトコードがプログラムです。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F Solidity:\n\u002F\u002F uint256 result = 2 + 3;\n\n\u002F\u002F バイトコードにコンパイル：\n\u002F\u002F PUSH1 0x02  PUSH1 0x03  ADD\n\n\u002F\u002F スタックトレース：\n\u002F\u002F []           -&gt; PUSH1 0x02 -&gt; [2]\n\u002F\u002F [2]          -&gt; PUSH1 0x03 -&gt; [2, 3]\n\u002F\u002F [2, 3]       -&gt; ADD        -&gt; [5]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>すべてのオペコードはスタックの上部からオペランドを消費し、結果をプッシュバックします。ADDオペコードは2つの値をポップし、加算し、合計をプッシュします。\u003C\u002Fp>\n\u003Ch2 id=\"\">オペコードカテゴリ\u003C\u002Fh2>\n\u003Cp>EVMは約140のオペコードを定義し、機能カテゴリにグループ化されています：\u003C\u002Fp>\n\u003Ch3>算術と比較\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>ADD、SUB、MUL、DIV、MOD\u003C\u002Fstrong> — 基本的な256ビット整数演算。すべて3ガス（G_verylow階層）。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SDIV、SMOD\u003C\u002Fstrong> — 2の補数を使用した符号付き除算と剰余。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ADDMOD、MULMOD\u003C\u002Fstrong> — モジュラー演算：単一のオペコードで\u003Ccode>(a + b) % N\u003C\u002Fcode>と\u003Ccode>(a * b) % N\u003C\u002Fcode>。楕円曲線演算に不可欠で、8ガス。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>EXP\u003C\u002Fstrong> — べき乗。10ガス + 指数のバイトあたり50、最も高価な算術オペコードの1つ。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>LT、GT、SLT、SGT、EQ、ISZERO\u003C\u002Fstrong> — 1（true）または0（false）をプッシュする比較オペコード。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>ビット演算\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>AND、OR、XOR、NOT\u003C\u002Fstrong> — ビット論理、各3ガス。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SHL、SHR、SAR\u003C\u002Fstrong> — 左シフト、論理右シフト、算術右シフト（Constantinople、EIP-145で追加）。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>BYTE\u003C\u002Fstrong> — 32バイトワードから単一バイトを抽出。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>スタック操作\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>POP\u003C\u002Fstrong> — 先頭要素を破棄。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PUSH1〜PUSH32\u003C\u002Fstrong> — 1〜32バイトの即値データをスタックにプッシュ。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DUP1〜DUP16\u003C\u002Fstrong> — N番目のスタック要素を先頭に複製。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SWAP1〜SWAP16\u003C\u002Fstrong> — 先頭要素をN番目の要素と交換。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">ガススケジュール\u003C\u002Fh2>\n\u003Cp>すべてのオペコードにはガスコストがあります。ガスは2つの目的を果たします：無限ループの防止（停止問題）と計算リソースの公正な価格設定です。\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>階層\u003C\u002Fth>\u003Cth>ガス\u003C\u002Fth>\u003Cth>例\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Zero\u003C\u002Ftd>\u003Ctd>0\u003C\u002Ftd>\u003Ctd>STOP、RETURN、REVERT\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Base\u003C\u002Ftd>\u003Ctd>2\u003C\u002Ftd>\u003Ctd>ADDRESS、ORIGIN、CALLER\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Very Low\u003C\u002Ftd>\u003Ctd>3\u003C\u002Ftd>\u003Ctd>ADD、SUB、LT、GT、AND、OR、POP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Low\u003C\u002Ftd>\u003Ctd>5\u003C\u002Ftd>\u003Ctd>MUL、DIV、MOD\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Mid\u003C\u002Ftd>\u003Ctd>8\u003C\u002Ftd>\u003Ctd>ADDMOD、MULMOD、JUMP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>High\u003C\u002Ftd>\u003Ctd>10\u003C\u002Ftd>\u003Ctd>JUMPI\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Special\u003C\u002Ftd>\u003Ctd>可変\u003C\u002Ftd>\u003Ctd>SLOAD、SSTORE、CALL、CREATE\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>高価なオペコードは状態にアクセスするものです：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F 状態アクセスのガスコスト（EIP-2929以降）：\n\u002F\u002F SLOAD（コールド）：2100ガス\n\u002F\u002F SLOAD（ウォーム）：100ガス\n\u002F\u002F SSTORE（コールド、0→非ゼロ）：22100ガス\n\u002F\u002F SSTORE（ウォーム）：100ガス（+ 0→非ゼロの場合20000）\n\u002F\u002F CALL（コールド）：2600ガス\n\u002F\u002F CALL（ウォーム）：100ガス\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"vs-eip-2929\">コールド vs ウォームアクセス（EIP-2929）\u003C\u002Fh2>\n\u003Cp>EIP-2929（ベルリンアップグレード、2021年4月）は、\u003Cstrong>アクセスリスト\u003C\u002Fstrong>の概念を導入しました — トランザクション内でアクセスされたアドレスとストレージスロットのセットです。\u003C\u002Fp>\n\u003Cp>トランザクション内で初めてストレージスロットまたは外部アドレスにアクセスする場合、「コールド」となり追加のガスがかかります。同じアドレス\u002Fスロットへのその後のアクセスは「ウォーム」で安価です。ストレージスロットを読む順序がガス最適化に重要な理由がここにあります。\u003C\u002Fp>\n\u003Ch2 id=\"\">実行フロー：トランザクションで何が起こるか\u003C\u002Fh2>\n\u003Cp>コントラクトを呼び出すトランザクションを送信すると、以下の完全な実行シーケンスが発生します：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>トランザクション検証\u003C\u002Fstrong> — ナンス確認、残高チェック、署名検証\u003C\u002Fli>\n\u003Cli>\u003Cstrong>固有ガス控除\u003C\u002Fstrong> — トランザクション自体に21000ガス、非ゼロcalldataバイトあたり16ガス、ゼロバイトあたり4ガス\u003C\u002Fli>\n\u003Cli>\u003Cstrong>コンテキストセットアップ\u003C\u002Fstrong> — EVMが実行コンテキストを作成\u003C\u002Fli>\n\u003Cli>\u003Cstrong>プログラムカウンタが0から開始\u003C\u002Fstrong> — EVMがposition 0のオペコードを読み取り実行\u003C\u002Fli>\n\u003Cli>\u003Cstrong>順次実行\u003C\u002Fstrong> — 各オペコードが実行され、ガスが控除される\u003C\u002Fli>\n\u003Cli>\u003Cstrong>終了\u003C\u002Fstrong> — STOP、RETURN、REVERT、またはガス切れで実行が終了\u003C\u002Fli>\n\u003Cli>\u003Cstrong>状態コミットまたはロールバック\u003C\u002Fstrong> — 成功時はすべての状態変更がコミット、リバート時はロールバック\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"jump\">プログラムカウンタとJUMP\u003C\u002Fh2>\n\u003Cp>プログラムカウンタ（PC）はバイトコード内の現在位置を追跡する暗黙のレジスタです。2つのオペコードがPCを直接変更します：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>JUMP\u003C\u002Fstrong> — スタックからデスティネーションをポップし、PCをその値に設定。デスティネーションにはJUMPDESTオペコードが必要。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>JUMPI\u003C\u002Fstrong> — 条件付きジャンプ。デスティネーションと条件をポップ。条件が非ゼロならジャンプ。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Solidityコンパイラは、calldataの最初の4バイトを読み込み、既知の関数シグネチャと比較し、一致するコードブロックにJUMPIする関数セレクタを生成します。\u003C\u002Fp>\n\u003Ch2 id=\"call-staticcall-delegatecall\">サブコール：CALL、STATICCALL、DELEGATECALL\u003C\u002Fh2>\n\u003Cp>コントラクトは3つのコールオペコードで他のコントラクトを呼び出せます：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>CALL\u003C\u002Fstrong> — 標準コール。独自のスタックとメモリを持つ新しい実行コンテキストを作成。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>STATICCALL\u003C\u002Fstrong> — 読み取り専用コール（EIP-214）。呼び出し先での状態変更オペコードは即座にリバート。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DELEGATECALL\u003C\u002Fstrong> — 呼び出し先のコードを呼び出し元のストレージコンテキストで実行。プロキシパターンの基盤。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"mev\">MEVへの実践的影響\u003C\u002Fh2>\n\u003Cp>MEVボットを構築している場合、オペコードレベルでのEVMの理解はオプションではなく、競争上の必要条件です。ボットの実行で節約されるすべてのガスユニットが利益マージンです。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>送信前にシミュレーション\u003C\u002Fstrong> — \u003Ccode>eth_call\u003C\u002Fcode>またはローカルEVM（revm、EVMONE）を使用\u003C\u002Fli>\n\u003Cli>\u003Cstrong>コールドアクセスを最小化\u003C\u002Fstrong> — アクセスリスト（EIP-2930）でストレージスロットをプリウォーム\u003C\u002Fli>\n\u003Cli>\u003Cstrong>読み取りにはSTATICCALLを使用\u003C\u002Fstrong> — わずかに安価で状態変更がないことを保証\u003C\u002Fli>\n\u003Cli>\u003Cstrong>オペコードコストを把握\u003C\u002Fstrong> — 1つのミスプレースされたSLOADが2100ガスのコスト\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">まとめ\u003C\u002Fh2>\n\u003Cp>EVMはそのシンプルさが美しい：256ビットワードのスタックマシン、フラットなバイトコードフォーマット、そしてすべての操作に価格をつけるガスメータリングシステム。この基盤 — オペコード、スタック、ガス — を理解することが、本シリーズで続くすべての前提条件です。\u003C\u002Fp>\n","ja","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.821928Z","Ethereum Virtual Machineの低レベルウォークスルー：オペコード、スタック操作、ガスメータリング、コールド vs ウォームアクセスを解説。","EVM オペコード",null,"index, follow",[21,26,30],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity","ブロックチェーン",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"d0000000-0000-0000-0000-000000000602","Ethereumインターオペラビリティレイヤー：55以上のL2が一つのチェーンになる方法","ethereum-interoperability-layer-55-l2-hitotsu-no-chain","Ethereumには55以上のLayer 2ロールアップがあり、流動性とユーザー体験が断片化しています。Ethereumインターオペラビリティレイヤー — クロスロールアップメッセージング、共有シーケンサー、ベースドロールアップを組み合わせて — それらを一つのコンポーザブルネットワークに統合することを目指しています。","2026-03-28T10:44:44.721589Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000601","ロールアップを超えるZK証明：Ethereumでの検証可能なAI推論","rollup-wo-koeru-zk-shomei-ethereum-kensho-kanou-ai-suiron","ゼロ知識証明はもはや単なるスケーリングツールではありません。2026年、zkMLはオンチェーンでの検証可能なAI推論を実現し、ZKコプロセッサは重い計算をオフチェーンで実行してオンチェーンで検証し、SP1やJoltなどの新しい証明システムが実用化を推進しています。","2026-03-28T10:44:44.716908Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"d0000000-0000-0000-0000-000000000578","EIP-7702実践ガイド：Pectra後のスマートアカウントフロー構築","eip-7702-jissen-gaido-pectra-go-sumaato-akaunto-furoo-kouchiku","EIP-7702により、任意のEthereum EOAが単一トランザクション内でスマートコントラクトとして一時的に動作可能になりました。バッチトランザクション、ガススポンサーシップ、ソーシャルリカバリーの実装方法を解説します。","2026-03-28T10:44:43.184719Z",{"id":13,"name":55,"slug":56,"bio":57,"photo_url":18,"linkedin":18,"role":58,"created_at":59,"updated_at":59},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]