Wolfram Computation Meets Knowledge

Cómo usar IPFS, Filecoin y Wolfram Language para crear una interfaz unificada de servicios descentralizados

Using IPFS, Filecoin and the Wolfram Language to Build a Unified Decentralized Services Interface

Como parte del objetivo central de Wolfram de crear una interfaz unificada de cadena de bloques, Wolfram Blockchain Labs (WBL) trabaja para brindar a los desarrolladores acceso directo un amplio rango de cadenas de bloques y tecnologías descentralizadas a través de Wolfram Language. Hoy, nos complace anunciar la colaboración con IPFS y Filecoin, componentes esenciales de la Web3 (o la web “descentralizada”). Además de la integración de Wolfram Language con IPFS y la cadena de bloques de Filecoin, esta colaboración única le permitirá a los desarrolladores aprovechar almacenamiento, redes de pares y otros protocolos para complementar sus aplicaciones existentes o sus nuevas aplicaciones descentralizadas, todo en tecnologías Wolfram como nuestro Wolfram Language, Wolfram Cloud y los cuadernos Wolfram.

La combinación de estos componentes permite nuevas posibilidades computacionales para la investigación, educación, comercio, finanzas y más. Junto con nuestros socios de Max Planck Digital Library, hemos desarrollado un magnífico ejemplo para investigadores que podrá ver en esta publicación. Además estamos enfocados en las futuras posibilidades, así que revisemos los detalles.

IPFS, Filecoin y libp2p han tenido un impacto fundamental en el movimiento Web3 para descentralizar el internet mediante tecnologías esenciales.

IPFS, Filecoin & libp2p: tecnologías fundamentales de la Web3

Filecoin complementa a IPFS y es un mercado de almacenamiento en la nube, protocolo y criptomoneda de código abierto. Ofrece almacenamiento de archivos a largo plazo por medio de una potente y dinámica solución de almacenamiento de nube descentralizada. Las partes interesadas en la red de cadena de bloques de Filecoin pueden “alquilar” el espacio de almacenamiento libre a cambio de una comisión de almacenamiento y recompensas de bloque, las cuales prolongarán la capacidad de almacenamiento a largo plazo de la red.

La lista de protocolos útiles continúa: libp2p para crear aplicaciones de redes de pares; Multiformats para proteger a los sistemas con formatos de archivos autodescritos contra la obsolescencia, y el ecosistema IPLD de formatos y estructuras de datos para crear aplicaciones totalmente descentralizadas. Wolfram contará con más actualizaciones a medida que nuestros desarrolladores continúen creando integraciones.

La mejor manera de ilustrar la facilidad e importancia del ecosistema IPFS y la potencia de la integración con Wolfram Language es con ejemplos del mundo real.

Cargue un archivo a IPFS:

ExternalStorageUpload
&#10005

ExternalStorageUpload["ExampleData/spikey2.png", 
 ExternalStorageBase -> "IPFS"]

Descargue un archivo de IPFS:

file = ExternalStorageDownload
&#10005

file = ExternalStorageDownload[
ExternalStorageObject[
  "QmXpif6oKinoP8CwPMCJPqoJNwvEfzbH1cJg6yZkBLJwKu", 
Association[
   "ExternalStorageBase" -> "IPFS", 
    "FileHash" -> "c9ccd63d95043f5d639a76b932dba6c9"]]]

Importe el archivo:

Import
&#10005

Import[file]

Caso práctico de bloxberg Certify & Verify

Cómo preparar los datos y cargar a IPFS

En este ejemplo utilizaremos un archivo PDF del libro blanco de Satoshi Nakamoto “Bitcoin: A Peer-to-Peer Electronic Cash System”, y lo prepararemos para ser enviado al contrato inteligente Certify de bloxberg. Adicionalmente, extendemos la funcionalidad al cargar el archivo a IPFS y crear un archivo de metadatos JSON que también será cargado a IPFS, y contiene el CID del archivo PDF.

Aplique hash al documento de investigación:

filePath = FileNameJoin
&#10005

filePath = FileNameJoin[{NotebookDirectory[], "bitcoin.pdf"}]

fileHash = FileHash
&#10005

fileHash = FileHash[filePath, "SHA256", "HexString"]

Obtenga la marca temporal Unix:

timestamp = ToString
&#10005

timestamp = ToString[UnixTime[Now]];

Cargue el archivo de investigación a IPFS:

eso = ExternalStorageUpload
&#10005

eso = ExternalStorageUpload[filePath, ExternalStorageBase -> "IPFS"]

Cree los metadatos del documento y el autor:

metadata = <|
   "Title" -> "Bitcoin: A Peer-to-Peer Electronic Cash System", 
   "Author" -> "Satoshi Nakamoto", "Affiliation" -> "bitcoin.org", 
   "FileCID" -> eso
&#10005

metadata = <|
   "Title" -> "Bitcoin: A Peer-to-Peer Electronic Cash System", 
   "Author" -> "Satoshi Nakamoto", "Affiliation" -> "bitcoin.org", 
   "FileCID" -> eso["CID"] |>;

metadata // Dataset
&#10005

metadata // Dataset

metadataFilePath = 
 Export
&#10005

metadataFilePath = 
 Export[FileNameJoin[{NotebookDirectory[], "metadata.json"}], 
  metadata, "JSON"]

Cargue los metadatos a IPFS:

metadataESO = 
 ExternalStorageUpload
&#10005

metadataESO = 
 ExternalStorageUpload[metadataFilePath, 
  ExternalStorageBase -> "IPFS"]

metadataCID = metadataESO
&#10005

metadataCID = metadataESO["CID"]

Cómo enviar datos al contrato inteligente Certify de bloxberg

En esta sección crearemos la transacción con todos los datos requeridos y la enviaremos a la cadena de bloques bloxberg para certificarla mediante el contrato inteligente Certify. Las siguientes claves privadas han sido publicadas para una mejor comprensión por parte de los lectores.

Inicialice algunas variables para la transacción:

key = PrivateKey
&#10005

key = PrivateKey[
Association[
   "Type" -> "EllipticCurve", "CurveName" -> "secp256k1", 
    "PublicCurvePoint" -> {
     27112075690151519677987005437167591271987576467999908152870704903\
750742697008, 
      3534019055898665520072520949331176238451788939602461575265997766\
3077697880714}, 
    "PrivateMultiplier" -> 8676843423833923876056101813405014181278722\
7642250635023819795985067687832300, "Compressed" -> False, 
    "PublicByteArray" -> ByteArray[{4, 59, 240, 228, 27, 20, 0, 72, 
      116, 89, 142, 194, 128, 17, 192, 43, 187, 15, 70, 187, 147, 254,
       186, 247, 198, 148, 96, 23, 200, 48, 179, 228, 48, 78, 33, 214,
       201, 224, 235, 43, 178, 189, 71, 151, 166, 253, 217, 43, 132, 
      24, 39, 185, 92, 213, 198, 0, 46, 244, 85, 165, 18, 11, 158, 
      130, 138}], 
    "PrivateByteArray" -> ByteArray[{191, 213, 49, 131, 159, 167, 125,
       243, 62, 158, 234, 92, 248, 2, 42, 136, 221, 127, 168, 24, 172,
       124, 117, 37, 61, 155, 34, 38, 150, 88, 106, 236}]]];

address = 
 BlockchainKeyEncode
&#10005

address = 
 BlockchainKeyEncode[key, "Address", BlockchainBase -> "bloxberg"]

txCount = 
 BlockchainAddressData
&#10005

txCount = 
 BlockchainAddressData[address, "TransactionCount", 
  BlockchainBase -> "bloxberg"]

Prepare la transacción:

tx = BlockchainTransaction
&#10005

tx = BlockchainTransaction[<|"TransactionCount" -> txCount, 
   "Address" -> "E5a9654C7e190701016EBf18206020bf16D8Beab", 
   "FunctionCall" -> <|
     "Function" -> 
      Typed["createData", {"string", "bool", "string", 
         "string"} -> {"bytes32"}], 
     "Inputs" -> {fileHash, True, metadataCID, timestamp}|>, 
   "GasPrice" -> Quantity[1, "Brox"], "BlockchainBase" -> "bloxberg"|>]

Firme la transacción:

txSigned = BlockchainTransactionSign
&#10005

txSigned = BlockchainTransactionSign[tx, key]

Envíe la transacción:

txSubmitted = BlockchainTransactionSubmit
&#10005

txSubmitted = BlockchainTransactionSubmit[txSigned]

txid = txSubmitted
&#10005

txid = txSubmitted["TransactionID"]

Revise la transacción:

Dataset
&#10005

Dataset[BlockchainTransactionData[txid, BlockchainBase -> "bloxberg"],
  HiddenItems -> {"EventList" -> True}, ItemSize -> {50}]

Cómo verificar los datos certificados en la cadena de bloques bloxberg

En esta sección llamaremos al contrato inteligente Verify de bloxberg para obtener los datos, y obtendremos el archivo PDF original de IPFS utilizando los metadatos JSON.

Obtenga los datos de verificación:

eventsList = 
  BlockchainTransactionData
&#10005

eventsList = 
  BlockchainTransactionData[txid, "EventList", 
   BlockchainBase -> "Bloxberg"];

verifyData = 
  BlockchainContractValue
&#10005

verifyData = 
  BlockchainContractValue[
   eventsList[[1]]["Address"], <|
    "Function" -> 
     Typed["retrieveResearchData", {"bytes32"} -> {"string", "string",
         "bytes32", "string", "bool"}], 
    "Inputs" -> eventsList[[1]]["Data"]|>, 
   BlockchainBase -> "Bloxberg"];

Dataset
&#10005

Dataset[Association["StringCheckSum" -> verifyData[[1]], 
  "IPFS" -> verifyData[[2]], "ResearchID" -> verifyData[[3]], 
  "Timestamp" -> FromUnixTime[ToExpression[verifyData[[4]]]], 
  "DataExists" -> verifyData[[5]]]]

Obtenga el CID de los metadatos de IPFS:

ipfsCID = verifyData
&#10005

ipfsCID = verifyData[[2]]

Descargue los metadatos de IPFS:

verifyMetadataFile = 
 ExternalStorageDownload
&#10005

verifyMetadataFile = 
 ExternalStorageDownload[ipfsCID, ExternalStorageBase -> "IPFS"]

Importe los metadatos:

verifyMetadata = Import
&#10005

verifyMetadata = Import[verifyMetadataFile, "RawJSON"];

Dataset
&#10005

Dataset[verifyMetadata]

Descargue el documento de investigación:

ExternalStorageDownload
&#10005

ExternalStorageDownload[verifyMetadata["FileCID"]]

Manténgase conectado: cómo causar un impacto en la Web3


Consideramos que la siguiente etapa del desarrollo del internet es un movimiento hacia la descentralización de páginas web y servicios. La integración de Wolfram Language con IPFS y Filecoin ampliará el rango de aplicaciones, servicios y análisis que las personas puedan crear, sin importar su experiencia de programación. Nuestro plan es ampliar nuestra colaboración con IPFS para incluir una integración de la cadena de bloques Filecoin, utilizando Filecoin para almacenamiento, manipulación simbólica de datos de IPFS y Filecoin, ejemplos analíticos, características educativas y más.

Esperamos contar con ejemplos de distintos campos y usuarios en el futuro:

  • Análisis de datos: tomar datos de Filecoin e IPFS y realizar análisis en los documentos, todo mediante Wolfram Language
  • NFT: utilizar cuadernos Wolfram, Wolfram Language y conexiones con cadenas de bloques para crear, descargar y utilizas los NFT
  • Círculos académicos: almacenar datos para uso abierto y comprensible, y un intercambio sofisticado de investigaciones
  • Comercio: trabajar con el Asesoramiento Técnico Wolfram para explorar prototipos avanzados y exploraciones
  • Desarrolladores: crear aplicaciones avanzadas por medio de capacidades computacionales

¡Nos encontramos en la cúspide de resaltar la utilidad de IPFS y las cadenas de bloques mediante un magnífico ejemplo acerca de los NFT que será divertido, emocionante y GRATUITO!

Conéctese con Wolfram Blockchain Labs para descubrir más sobre cómo integrar su cadena de bloques en Wolfram Language. Conéctese con el Asesoramiento Técnico Wolfram para iniciar un proyecto de cadena de bloques.