suchen
HeimWeb-Frontendjs-TutorialEinführung in die Methode zur Implementierung einer kleinen Blockchain in Javascript (mit Code)

Dieser Artikel bietet Ihnen eine Einführung in die Methode zur Implementierung einer kleinen Blockchain (mit Code). Ich hoffe, dass er für Freunde hilfreich ist.

Blockchain-Konzept

Enger Sinn: Blockchain ist eine Kettendatenstruktur, die Datenblöcke sequentiell in chronologischer Reihenfolge kombiniert und kryptografisch ein unveränderliches und fälschungssicheres verteiltes Hauptbuch garantiert.

1. Mining (Generieren neuer Blöcke)

Zuerst wird die Blockchain durch die Verbindung jedes Blocks gebildet, bevor ein neuer Block generiert werden kann Es gibt einen Anfangsblock, der auch Genesis-Block genannt wird. Durch diesen Genesis-Block wird der Block, der die Bedingungen erfüllt, durch ständige Änderung der Zufallszahl (Nonce) berechnet. Das Folgende sind die grundlegenden Informationen des Genesis-Blocks:

const initBlock = {
    index: 0,
    data: 'hey,this is a block chain',
    previousHash: '0',
    timestamp: '1551806536961',
    nonce: 80490,
    hash: '0000352fb27dd1141fa7265833190a53e5776b1111e275db0d9a77bf840081e6'
};
  1. Index: bezieht sich auf die Seriennummer jedes Blocks
  2. Daten: Alle Informationen im Block werden hier gespeichert, z Überweisungen, Kontostand und andere Daten
  3. Vorheriger Hash: Bezieht sich auf den Hash-Wert des vorherigen Blocks. Der Genesis-Block hat keinen vorherigen. Zeigt einfach 0 an.
  4. Zeitstempel: Bezieht sich auf die Zeit Wann dieser Block erstellt wurde: Dies ist eine Zufallszahl. Beim Mining wird der Hash berechnet, der die Bedingungen erfüllt, indem dieser Nonce ständig geändert wird.
  5. Hash: Der Hash-Wert dieses Blocks, der Wert, der durch Hashing der Informationen in den vorherigen fünf Feldern erhalten wird.
  6. Dann wird der Hash, der die Bedingungen erfüllt, durch kontinuierliche Hash-Operationen, also Mining, berechnet. Mining kann auch den Schwierigkeitsgrad anpassen, beispielsweise müssen die ersten drei Ziffern des berechneten Hash-Werts 1 sein oder die letzten drei Ziffern müssen 1 sein usw. Dies kann von Ihnen selbst definiert werden, sofern ein Steuerschalter vorhanden ist Ende aus Bequemlichkeitsgründen. Nur Kontrolle. Sie können eine Variable

definieren, um den Hash zu berechnen:

 .createHash('sha256')
 .update(index + data + previousHash + timestamp + nonce)
 .digest('hex')
_that.difficulty = 3   // 即前3位或者末3位数必须为1,数量越多难度越大

Nach der Generierung eines Hashs, der die Bedingungen erfüllt, wird ein neuer Block generiert, dieser Block muss jedoch überprüft werden ist gültig, da es sich möglicherweise um einen illegalen Block handelt, der manipuliert wurde, oder um einen Block, der nichts mit der Kette zu tun hat, sondern lediglich den oben genannten Hash-Regeln entspricht. Daher ist es notwendig, die Gültigkeit der Vorher- und Nachher-Blöcke zu überprüfen.

isValidaBlock(newBlock,lastBlock) {
     if (newBlock.index !== lastBlock.index+1) return false
     if (newBlock.previousHash !== lastBlock.hash) return false
     if (newBlock.timestamp <p>Zusätzlich zur oben genannten Überprüfung müssen Sie auch die obige Funktion verwenden, um jeden Block der gesamten Kette zu überprüfen, um sicherzustellen, dass die Informationen in jedem Block korrekt sind und nicht manipuliert wurden. </p><p></p>2. Aufbau eines P2P-Netzwerks <p style="white-space: normal;"><strong></strong>Das Blockchain-Netzwerk ist dezentralisiert, das heißt, es gibt kein zentrales Servernetzwerk und der Client muss sich nicht darauf verlassen zentraler Server, um Daten zu erhalten oder zu verarbeiten. Im Blockchain-Netzwerk gibt es viele Knoten. Sie sind sowohl Clients als auch Server. Die Knoten sind direkt Punkt-zu-Punkt verbunden. Die Übertragung erfolgt nicht über eine Zentrale Daher ist eine Punkt-zu-Punkt-Verbindung aus Sicht der Informationssicherheit für den Datenschutz sehr zuverlässig. </p><p></p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/102/511/987/1554254785651010.png?x-oss-process=image/resize,p_40" class="lazy" title="1554254785651010.png" alt="Einführung in die Methode zur Implementierung einer kleinen Blockchain in Javascript (mit Code)">Obwohl die Blockchain Daten über Punkt-zu-Punkt-Verbindungen überträgt, ist vorher noch etwas als Leitfaden erforderlich, nämlich der Seed-Knoten. Da sich die beiden Knoten möglicherweise nicht in derselben Domäne befinden, muss eine Partei, wenn sie miteinander Kontakt aufnehmen möchten, die IP und den Port der anderen Partei kennen, damit sie die andere Partei kontaktieren kann. Knoten-IP und Portnummer Nachdem der Knoten erstellt wurde, sendet ihm der Seed-Knoten die IP- und Portnummer aller Knoten in der Blockchain und zeichnet die IP- und Portnummer des neuen Partners auf. Nachdem der neue Knoten dieses „Adressbuch“ erhalten hat, sendet er eine Nachricht an alle Freunde in diesem „Adressbuch“ und teilt ihnen mit, dass ein neuer Freund beigetreten ist. Danach erhalten andere Knoten diese Informationen, die des neuen Partners IP und Portnummer werden ebenfalls zu seinem „Adressbuch“ hinzugefügt, was einem Beitritt zur Whitelist gleichkommt. Auf diese Weise kann der neue Knoten dann mit jedem beliebigen Knoten kommunizieren. </p><p>Das Folgende ist eine Codedemonstration: </p><pre class="brush:php;toolbar:false">(res)=>{
  _that.remotePeerInfo = res.data.data   //1
  _that.addPeersList(res.peersList)             //2
  _that.boardCast(_that.remotePeerInfo)    //3
  _that.blockChainUpdate(blockChain,blockData)     //4
}

addPeersList(peers) {
    peers.forEach(peer => {
        if (!_that.peers.find(v => _that.isEqualPeer(peer, v))) {
            _that.peers.push(peer)
        }
    })
}

boardCast(remotePeerInfo) {
    this.peers.forEach(v => {
        this.send(action, v.port, v.address)
    })
}

blockChainUpdate(blockChain,blockData){
  if(newChain.length === 1 ){
    return
    }

    if(_that.isValidaChain(newChain) && newChain.length>_that.blockchain.length){
    _that.blockchain = Object.assign({}, newChain)
    }else{
    console.log('error')
    return
    }

    if (trans.every(v => _that.isValidTransfer(v))) {
    _that.data = trans
    }
}

1. Speichern Sie die Informationen des neuen Knotens vom Seed-Knoten, einschließlich der IP- und Portnummer, da die IP- und Portnummer des neuen Knoten wird geändert werden Umstände.

2. Akzeptieren Sie die Knotenliste vom Startknoten, durchlaufen und überprüfen Sie die Knoten in der Liste und schreiben Sie sie in die Liste, wenn sie nicht identisch sind.

3. Senden Sie die Informationen des neuen Knotens an alle Knoten, und gleichzeitig aktualisieren die Knoten, die die Informationen erhalten, die Knotenliste

4. Synchronisieren Sie die Informationen lokal auf der Blockchain . Gleichzeitig werden die Informationen jedes Blocks auf der vom Seed-Knoten übertragenen Blockchain verarbeitet

3. Transaktion übertragen

Das Transaktionsmodell von BTC verwendet UTXO

Einführung in die Methode zur Implementierung einer kleinen Blockchain in Javascript (mit Code)Das Transaktionsmodell dieser kleinen Blockchain verwendet die einfachste Methode.

区块链中"现金”,它是一个虚拟的东西就是一个字符串,来源于挖矿。每次挖矿成功都会有一定的奖励,得到的这些“钱”就可以在区块链网络中自由的转账交易。

在区块链中,进行记录转账交易的时候是需要一个加密的算法,把所有的信息进行加密之后再push到新区块中的data中,从而完成一笔新交易的记录。以BTC为例,BTC的加密算法是使用elliptic这个加密算法,elliptic是一个非对称性的加密算法,非对称的加密算法的特点就是,私钥是惟一的,只有拥有者才可以和他私钥对应的公钥进行校验 。 nodejs也有对应的库在github上搜索elliptic即可。

{
  "privateKey": "34a425df3eb1f22fb6cb74b0e7298b16ffd7f3fb",
  "publicKey": "ac208623a38d2906b090dbcf3a09378dfe79b77bf39c2b753ef98ea94fe08dc3995a1bd05c917"
}

上面是一个生成好的密钥对格式,仅作为展示,我删减了一部分长度。

使用银行卡进行转账交易的时候,会有一个转出的账号和一个转入的账号,在区块链中的记账也会有这个账号,这个账号就是上面使用生成的密钥对中的公钥,公钥就是地址,或者说公钥代表的就是自己的钱包。

校验的方法,首先使用字段“from”,“to”,“amount”的参数进行sign签名,然后在每次挖矿(记账)的时候,则使用verify(),通过前面的三个参数,和sig进行校验

verify(type,data){
    swtich(type){
        case 'sign':
            const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)
            let signature = Buffer.from(keypair.sign(bufferMsg).toDER()).toString('hex')
               this.signature =  signature
        break;
        case 'verify':
             const keypairTemp = ec.keyFromPublic(pub, 'hex')
                const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)
             this.keypair = keypairTemp.verify(bufferMsg, sig)
        break;
        default;
    }
}

转帐的时候需要3步,分别是校验转出账户是否有足够的金额,转出账户就是本地公钥。如有则进行记账并且使用两个地址、金额、时间,还有签名加密打包,之后进行全节点广播。其他节点收到这个信息之后第一件事也是对新区块的有效性做一个校验,通过校验之后就会写入data中。

transfer(data)  {
    const timestamp = new Date().getTime()
    const sig = rsa.sign({data.from, data.to, data.amount , timestamp})
    const sigTrans = {data.from, data.to, data.amount ,timestamp, sig }

        // 非创世区块
    if (trans.from !== '0') {
            // 检验余额
        if (!(_that.blance <p>其他节点收到消息之后,先进行去重校验,然后再更新数据。</p><h3 id="四-查询余额">四、查询余额</h3><p>这个链的查询方法比较简单,就是将区块中的每一条交易的信息进行校验和匹配,满足条件的就进行增减,同时忽略精度上的问题。</p><pre class="brush:php;toolbar:false"> this.blance = blance(address)
 blance(address) {
        let blance = 0;
        this.blockchain.forEach(block => {
            block.data.forEach(trans => {
                if (address == trans.from) {
                    blance -= trans.amount
                }

                if (address == trans.to) {
                    blance += trans.amount
                }

            })

        });
        return blance
    }

至此,区块链的最简单的功能就实现完毕。

【相关推荐:JavaScript视频教程

Das obige ist der detaillierte Inhalt vonEinführung in die Methode zur Implementierung einer kleinen Blockchain in Javascript (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:segmentfault. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
JavaScript -Engines: Implementierungen vergleichenJavaScript -Engines: Implementierungen vergleichenApr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AM

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten

JavaScript: Erforschung der Vielseitigkeit einer WebspracheJavaScript: Erforschung der Vielseitigkeit einer WebspracheApr 11, 2025 am 12:01 AM

JavaScript ist die Kernsprache der modernen Webentwicklung und wird für seine Vielfalt und Flexibilität häufig verwendet. 1) Front-End-Entwicklung: Erstellen Sie dynamische Webseiten und einseitige Anwendungen durch DOM-Operationen und moderne Rahmenbedingungen (wie React, Vue.js, Angular). 2) Serverseitige Entwicklung: Node.js verwendet ein nicht blockierendes E/A-Modell, um hohe Parallelitäts- und Echtzeitanwendungen zu verarbeiten. 3) Entwicklung von Mobil- und Desktop-Anwendungen: Die plattformübergreifende Entwicklung wird durch reaktnative und elektronen zur Verbesserung der Entwicklungseffizienz realisiert.

Die Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenDie Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenApr 10, 2025 am 09:33 AM

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

Entmystifizieren JavaScript: Was es tut und warum es wichtig istEntmystifizieren JavaScript: Was es tut und warum es wichtig istApr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Ist Python oder JavaScript besser?Ist Python oder JavaScript besser?Apr 06, 2025 am 12:14 AM

Python eignet sich besser für Datenwissenschaft und maschinelles Lernen, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python ist bekannt für seine prägnante Syntax- und Rich -Bibliotheks -Ökosystems und ist für die Datenanalyse und die Webentwicklung geeignet. 2. JavaScript ist der Kern der Front-End-Entwicklung. Node.js unterstützt die serverseitige Programmierung und eignet sich für die Entwicklung der Vollstapel.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)