Solución de problemas
Si estas sugerencias no funcionan, no dude en preguntar en las Semaphore Discussions o en el canal Semaphore Telegram.
Usando Semaphore en the frontend
Semaphore funciona con cualquier framework de JavaScript, pero el paquete @semaphore-protocol/proof
está usando snarkjs, que usa módulos Node.js que no son compatibles con los frameworks de frontend y hay algunos cambios que debemos hacer para que funcione en el lado del cliente.
Semaphore con Nextjs
Verá un error como este:
Module not found: Can't resolve 'fs'
Para resolver esto, en su archivo next.config.js
, dentro del objeto nextConfig
, agregue:
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.fallback = {
fs: false
}
}
return config
}
Su fichero next.config.js
sería algo como esto:
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.fallback = {
fs: false
}
}
return config
}
}
module.exports = nextConfig
Semaphore con React + Vite o Vuejs + Vite
Verá un error como este:
readman.js:43 Uncaught ReferenceError: process is not defined
at stringToBase64 (threadman.js:43:5)
at threadman.js:50:22
Para resolver eso:
1- Instale @esbuild-plugins/node-globals-polyfill
y @esbuild-plugins/node-modules-polyfill
- npm
- Yarn
- pnpm
npm install @esbuild-plugins/node-globals-polyfill
yarn add @esbuild-plugins/node-globals-polyfill
pnpm add @esbuild-plugins/node-globals-polyfill
- npm
- Yarn
- pnpm
npm install @esbuild-plugins/node-modules-polyfill
yarn add @esbuild-plugins/node-modules-polyfill
pnpm add @esbuild-plugins/node-modules-polyfill
2- Modifique vite.config.ts
para añadirlos:
import { NodeGlobalsPolyfillPlugin } from "@esbuild-plugins/node-globals-polyfill"
import { NodeModulesPolyfillPlugin } from "@esbuild-plugins/node-modules-polyfill"
y en defineConfig
agregue:
optimizeDeps: {
esbuildOptions: {
// Enable esbuild polyfill plugins
plugins: [
NodeGlobalsPolyfillPlugin({
process: true,
buffer: true
}),
NodeModulesPolyfillPlugin()
]
}
}
Su fichero vite.config.ts
debería ser algo como:
import { fileURLToPath, URL } from "node:url"
import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import { NodeGlobalsPolyfillPlugin } from "@esbuild-plugins/node-globals-polyfill"
import { NodeModulesPolyfillPlugin } from "@esbuild-plugins/node-modules-polyfill"
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url))
}
},
optimizeDeps: {
esbuildOptions: {
// Enable esbuild polyfill plugins
plugins: [
NodeGlobalsPolyfillPlugin({
process: true,
buffer: true
}),
NodeModulesPolyfillPlugin()
]
}
}
})
En caso de React con Vite, si ve un subrayado ondulado rojo en cada módulo Semaphore que dice Could not find a declaration file for module ...
, cambie el moduleResolution
de bundler
a Node
en el fichero tsconfig.json
dentro de compilerOptions
.
Su fichero tsconfig.json
sería algo así:
{
"compilerOptions": {
"target": "ESNext",
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "Node",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
Grupos de Semaphore
Creando un Grupo
Cuando crea un grupo y se revierte la transacción, asegúrese de que la identificación del grupo que está utilizando no existe en la red que está utilizando.
Para comprobarlo, puede utilizar la Semaphore CLI con el comando get-groups
y la red que está utilizando y luego, asegúrese de que su id de grupo no sea parte de esa lista. También puede utilizar el Semaphore explorer.
Semaphore Proofs
Transacción revertida al usar el mismo external nullifier
Cuando genera una prueba usando el mismo external nullifier que usó para verificar una prueba antes, la transacción se revertirá porque ese external nullifier ya se usó. Si desea enviar y verificar varias pruebas de la misma identidad, debe usar un external nullifier diferente cada vez que genere una prueba.