Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
브라우저에서 SeedSigner를 체험합니다. 펌웨어가 화면을 그리고 웹캠으로 QR을 스캔합니다. 설치 없이 가상 시드 사용
Try a real SeedSigner in your browser. The firmware draws its own 320x240 screen and scans QR codes through your webcam. Nothing to install, no real seeds.
금융JavaScript · PythonGitHub @bitsagarob온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기The real SeedSigner firmware running in a browser tab: a simulator you can try before buying the device, and rebuild yourself to check it is the pinned upstream release.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Real SeedSigner firmware, the actual Python off the
device, running in a browser tab. The screen is a canvas, the buttons are your
keyboard, the camera is your webcam.
Never type in a seed phrase you rely on. Use a published test seed.
Nothing makes this safe: not running it offline, not a private window, not a
clean laptop. See below.
A SeedSigner is a signing device because of what surrounds the software. None of
that is here. Only the software is.README 전문 보기 ↗Real SeedSigner firmware, the actual Python off the device, running in a browser tab. The screen is a canvas, the buttons are your keyboard, the camera is your webcam.
Insecure by design
Never type in a seed phrase you rely on. Use a published test seed.
Nothing makes this safe: not running it offline, not a private window, not a clean laptop. See below.
A SeedSigner is a signing device because of what surrounds the software. None of that is here. Only the software is.
| A real SeedSigner | This page |
|---|---|
| No wifi, no bluetooth, no port | A computer that has all three |
| Runs one program and nothing else | Runs beside extensions, other tabs, devtools, every process on the machine |
| Loses everything at power-off | A JavaScript heap, copied by the garbage collector into swap and hibernation files |
| A real smartcard holds the key | A JavaScript object pretending to be a smartcard |
| A screen only you see | A canvas any script or screen recorder can read |
Offline does not help. It changes one row and leaves the rest. The seed is still typed into a general-purpose computer with an OS, a clipboard, a swap file and a network connection it will use again later. Anything there that can read memory or the screen can read the seed. Having no network is a property of the page, not of the computer, and a tab is a sandbox against other websites, not against the machine it runs on.
Mainnet works, which is the dangerous part. The page boots on Testnet, but
Mainnet is still in Settings, deriving real keys and signing real transactions
(test/test_mainnet.py checks them against BIP32, BIP143 and ECDSA). Treat
everything it shows you as public: seeds, passphrases, xpubs, descriptors,
signatures.
If you already entered a real seed here, move the funds to a seed generated on a device you trust. SECURITY.md.
Good for learning the menus, rehearsing a flow, teaching multisig, testing a fork's screens. Anything involving money belongs on hardware.
| On the page | What it is | URL |
|---|---|---|
| SeedSigner | Stock, what a plain SeedSigner runs. The default | ?firmware=stock |
| ShieldSigner | 3rdIteration/seedsigner, adds SeedKeeper and Satochip | ?firmware=smartcard |
| Doomsigner | Our fork of that fork: BIP-352 silent payments, and DOOM in front | ?firmware=doomsigner |
The Firmware control under the device switches. DOOM is off on the first two
unless ?doom is on the URL; on Doomsigner it always boots into the game, and
five taps on the top side button reach the wallet.
git clone https://github.com/bitsagarob/seedsigner-simulator.git
cd seedsigner-simulator
./build/fetch-assets.sh # Pyodide, pinned and hash-checked (~26 MB, once)
./build/build-wallet-zip.sh smartcard # wallet-smartcard.zip, from the pinned commit
./build/build-wallet-zip.sh stock # wallet-stock.zip, from the pinned commit
python3 test/serve.py --port 8770 src/web src/shims build/out
Then open http://127.0.0.1:8770/. Use test/serve.py, not
python3 -m http.server: without the two isolation headers it sends, the wallet
never starts. Nothing fetched is committed, so what you run is provably the
pinned commit, and both steps verify what they download.
Arrow keys move, Enter selects, 1 2 3 are the side buttons, and the drawn
buttons work too. The screen is not one of them: a SeedSigner has no touchscreen.
To run your own fork, SS_REPO and SS_COMMIT override the pin for one build
(CONTRIBUTING.md).
wallet-<firmware>.zip holds that
firmware's upstream Python tree and its own Controller.start() runs it.
Menus, seed handling, PSBT parsing, QR encoders: all theirs, unmodified.src/shims/. Even Testnet-at-boot is a value in the
settings.json the device reads, not an edit.UPSTREAM, one
section per firmware). The fork's tag is the one the official pi0-smartcard
device image is built from, so this and that device run the same code.build/build-wallet-zip.sh reproduces a zip byte for
byte. CI re-derives the hashes on every push on a clean runner and GitHub signs
the result:
gh attestation verify wallet-smartcard.zip --repo bitsagarob/seedsigner-simulator.upstream-tests.yml): about 2,500
from the fork's suite, all of stock's. About 200 of the fork's skip themselves,
most for want of a jcardsim build, pyscard or SeedSigner OS's own tools.DecodeQR, same SeedQR /
CompactSeedQR / PSBT / UR parsing; only the decoder is the browser's.signet.bitsaga.be, for the faucet and read-only lookups.Three guided ceremonies done in the page. The resting page is a plain
SeedSigner, so none of them starts on its own: open the wallet drawer and the
picker offers whichever ones the running firmware can do, or name one on the URL
as ?tutorial=single, ?tutorial=multi or ?tutorial=musig.
| Walkthrough | Firmwares | What it does |
|---|---|---|
| Single sig | SeedSigner, ShieldSigner, DoomSigner | makes a seed, backs it up, exports the key, funds it, signs and sends. A checkbox adds a passphrase |
| Multisig | SeedSigner, ShieldSigner, DoomSigner | a 2 of 3, from three cards on the forks and by QR on stock |
| MuSig2 | DoomSigner | a 2 of 3 MuSig2, nonces exchanged and both cards signing. DoomSigner boots into DOOM, so five taps on the top side button open the wallet first |
Three published test seeds, the real PIN ceremony where there are cards, the faucet on Bitsaga Signet pays the wallet, and the spend confirms. Those coins are not real bitcoin. Press play and it narrates itself, or take over and press the buttons.
The coordinator is drawn as a phone beside the device, because that is what it
is: signet-coordinator.js builds the
descriptor, addresses, PSBT and final transaction in the browser, and
test/test_tutorial.py checks every value against the wallet's own embit. The QR
transfers are real modules read off real pixels by the wallet's own decoder, so
your webcam is never involved.
Holding three keys on one device is fine for a demo and wrong for real funds.
Cards are the fork's, so under stock there is no card tray at all.
Works, any firmware. The full menu tree, seed loading by QR or by hand, passphrases, xpub export, PSBT signing, SeedQR backup, settings, every QR screen.
Works, ShieldSigner and Doomsigner. Three card slots, each a SeedKeeper or a Satochip, both PIN-checked. Seed onto a SeedKeeper and back off. A 2 of 3 descriptor onto a SeedKeeper. Satochip holds a real BIP32 master key and authentikey, and pysatochip verifies every answer it signs.
Does not, any firmware. No microSD, so settings reset on reload and firmware update is gone. Nothing on a background thread: no spinner, no scrolling text, no pulsing border, and thread-based work such as brute-force address verification never completes (camera preview and animated QR are pumped by hand). No timing, so no wipe timer, screensaver or battery reading.
Does not, the fork. Card-to-card secret copy (refused rather than done in the clear), card signing, PIN change, 2FA, factory reset, and Satodime: the fork lists it under Smartcard Tools, and the tray has no Satodime to offer. Cards forget on reload, deliberately.
The wallet's Python runs under Pyodide (CPython on WebAssembly) in a Web Worker. Four hardware seams are replaced, three under stock.
| Seam | Replaced by | Why |
|---|---|---|
| Display | browser_display.py | Swaps the panel driver under SeedSigner's unmodified Renderer; RGB frames go to a canvas. |
| Buttons | wallet-worker.js | The worker is blocked in the wallet's main loop and can never answer a postMessage, so keys cross on a SharedArrayBuffer. |
| Camera + QR | browser_camera.py + wallet-camera.js | pyzbar has no WebAssembly build, so the browser decodes and hands bytes to the unmodified decoder. |
| Smartcard | src/smartcard/ | Browsers have no smartcard API, so simulated cards answer real APDUs and pysatochip runs unchanged. |
A fifth, browser_qr.py, draws the QR screens, whose
drawing lives in a thread this environment cannot run.
That one constraint, a permanently blocked worker, explains most of the
architecture. docs/ARCHITECTURE.md is the long version,
including why BarcodeDetector is never trusted with a payload.
Static files. Two things trip up every first attempt (docs/SELF-HOSTING.md):
Cross-Origin-Opener-Policy: same-origin and
Cross-Origin-Embedder-Policy: require-corp are mandatory, or
SharedArrayBuffer does not exist and the wallet never starts.https or localhost. Plain http on a LAN has no camera
API to ask.python3 test/run.py builds what is missing and runs everything in a real
browser. CONTRIBUTING.md covers the rest,
test/README.md says what each test proves, and ?debug=1 traces
every screen, thread and keypress. Security reports: SECURITY.md.
MIT, see LICENSE. Almost none of this code was written here: the wallet is upstream SeedSigner (MIT, Copyright (c) 2021 SeedSigner), the smartcard build is pinned to 3rdIteration/seedsigner, and the browser side rests on Pyodide and jsQR. THIRD-PARTY.md lists every dependency and how to check it.
Independent project, not affiliated with or endorsed by SeedSigner. Running it proves nothing about a real device.