Saltar al contenido principal
Versión: V3

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 install @esbuild-plugins/node-globals-polyfill
npm install @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()
]
}
}
})
información

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.