Alchemy University 学习教程,Blockchain Storage

估值102亿融资5.45亿的Alchemy 项目,大学每周任务逐步开始。持有大学生早期卡的伙伴们可以开始大学生活了:

官方大佬的 lens ,可以关注下:

了解更多,请关注作者:https://twitter.com/bitc2024

部分章节是看文章和视频的,自行查看哈,这里从实际操作开始。

Keeping Track of Blockchain User State

Coding the UTXO Model

1: Transaction Output

查看要求:

输入:

class TXO {
    constructor(owner, amount) {
        this.owner = owner;
        this.amount = amount;
        this.spent = false;
    }
    spend() {
        this.spent = true;
    }
}

module.exports = TXO;

点击运行。

2: Spent TXOs
查看要求:

输入:

class Transaction {
    constructor(inputUTXOs, outputUTXOs) {
        this.inputUTXOs = inputUTXOs;
        this.outputUTXOs = outputUTXOs;
    }
    execute() {
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            if (this.inputUTXOs[i].spent) {
                throw new Error("already spent");
            }
        }
    }
}

module.exports = Transaction;

点击运行。

3: Sufficient Amount

查看要求:

class Transaction {
    constructor(inputUTXOs, outputUTXOs) {
        this.inputUTXOs = inputUTXOs;
        this.outputUTXOs = outputUTXOs;
    }
    execute() {
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            if (this.inputUTXOs[i].spent) {
                throw new Error("already spent");
            }
        }

        let inn = 0;
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            inn = inn + this.inputUTXOs[i].amount;
        }
        let out = 0;
        for (let i = 0; i < this.outputUTXOs.length; i++) {
            out = out + this.outputUTXOs[i].amount;
        }
        if (inn < out) {
            throw new Error("less than");
        }
    }
}

module.exports = Transaction;

点击运行。

4: Successful Execute

查看要求:

输入:

class Transaction {
    constructor(inputUTXOs, outputUTXOs) {
        this.inputUTXOs = inputUTXOs;
        this.outputUTXOs = outputUTXOs;
    }
    execute() {
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            if (this.inputUTXOs[i].spent) {
                throw new Error("already spent");
            }
        }

        let inn = 0;
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            inn = inn + this.inputUTXOs[i].amount;
        }
        let out = 0;
        for (let i = 0; i < this.outputUTXOs.length; i++) {
            out = out + this.outputUTXOs[i].amount;
        }
        if (inn < out) {
            throw new Error("less than");
        }

        for (let i = 0; i < this.inputUTXOs.length; i++) {
            this.inputUTXOs[i].spend();
        }
    }
}

module.exports = Transaction;

点击运行。

5: Miner's Fee

查看要求:

输入:

class Transaction {
    constructor(inputUTXOs, outputUTXOs) {
        this.inputUTXOs = inputUTXOs;
        this.outputUTXOs = outputUTXOs;
    }
    execute() {
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            if (this.inputUTXOs[i].spent) {
                throw new Error("already spent");
            }
        }

        let inn = 0;
        for (let i = 0; i < this.inputUTXOs.length; i++) {
            inn = inn + this.inputUTXOs[i].amount;
        }
        let out = 0;
        for (let i = 0; i < this.outputUTXOs.length; i++) {
            out = out + this.outputUTXOs[i].amount;
        }
        if (inn < out) {
            throw new Error("less than");
        }

        for (let i = 0; i < this.inputUTXOs.length; i++) {
            this.inputUTXOs[i].spend();
        }

        this.fee = inn - out;
    }
}

module.exports = Transaction;

点击运行。

Tree Data Structures

Build a Binary Search Tree

1: Node

查看要求:

输入:

class Node {
    constructor(data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

module.exports = Node;

点击运行。

2: Tree

查看要求:

输入:

class Tree {
    constructor() {
        this.root = null;
    }
}

module.exports = Tree;

点击运行。

3: Add Root

查看要求:

输入:

class Tree {
    constructor() {
        this.root = null;
    }

    addNode(node) {
        this.root = node;
    }
}

module.exports = Tree;

点击运行。

4: First Layer

查看要求:

输入:

class Tree {
    constructor() {
        this.root = null;
    }

    addNode(node) {
        if (this.root === null) {
            this.root = node;
        } else if (this.root.data > node.data) {
            this.root.left = node;
        } else {
            this.root.right = node;
        }
    }
}

module.exports = Tree;

点击运行。

5: Many Layers

查看要求:

输入:

class Tree {
    constructor() {
        this.root = null;
    }

    addNode(node) {
        if (this.root === null) {
            this.root = node;
        } else {
            let p = this.root;
            while (true) {
                if (p.data > node.data) {
                    if (p.left) {
                        p = p.left;
                    } else {
                        p.left = node;
                        break;
                    }
                } else {
                    if (p.right) {
                        p = p.right;
                    } else {
                        p.right = node;
                        break;
                    }
                }
            }
        }
    }
}

module.exports = Tree;

点击运行。

6: Search

查看要求:

输入:

class Tree {
    constructor() {
        this.root = null;
    }

    addNode(node) {
        if (this.root === null) {
            this.root = node;
        } else {
            let p = this.root;
            while (true) {
                if (p.data > node.data) {
                    if (p.left) {
                        p = p.left;
                    } else {
                        p.left = node;
                        break;
                    }
                } else {
                    if (p.right) {
                        p = p.right;
                    } else {
                        p.right = node;
                        break;
                    }
                }
            }
        }
    }

    hasNode(number) {
        let n = this.root;
        while(n) {
            if (n.data === number) {
                return true;
            } else {
                if (n.data > number) {
                    n = n.left;
                } else {
                    n = n.right;
                }
            }
        }
        return false;
    }
}

module.exports = Tree;

点击运行。

Merkle Trees

1: Combine Two Leaves

查看要求:

输入:

class MerkleTree {
    constructor(leaves, concat) {
        this.leaves = leaves;
        this.concat = concat;
    }
    getRoot() {
        return this.concat(this.leaves[0], this.leaves[1]);
    }
}

module.exports = MerkleTree;

点击运行。

2: Multiple Layers

查看要求:

输入:

class MerkleTree {
    constructor(leaves, concat) {
        this.leaves = leaves;
        this.concat = concat;
    }
    getRoot(next = this.leaves) {
        while(true) {
            if (next.length <= 1) {
                return next;
            }
            let level = [];
            for (let i = 0; i < next.length; i+=2) {
                level.push(this.concat(next[i], next[i+1]));
            }
            next = level;
        }
    }
}

module.exports = MerkleTree;

点击运行。

3: Odd Leaves

查看要求:

输入:

class MerkleTree {
    constructor(leaves, concat) {
        this.leaves = leaves;
        this.concat = concat;
    }
    getRoot(next = this.leaves) {
        while (true) {
            if (next.length <= 1) {
                return next;
            }
            let level = [];
            for (let i = 0; i < next.length; i += 2) {
                if ((i + 1) >= next.length) {
                    level.push(next[i]);
                } else {
                    level.push(this.concat(next[i], next[i + 1]));
                }
            }
            next = level;
        }
    }
}

module.exports = MerkleTree;

点击运行。

4: Build the Proof

查看要求:

输入:

class MerkleTree {
    constructor(leaves, concat) {
        this.leaves = leaves;
        this.concat = concat;
    }
    getRoot(next = this.leaves) {
        while (true) {
            if (next.length <= 1) {
                return next;
            }
            let level = [];
            for (let i = 0; i < next.length; i += 2) {
                if ((i + 1) >= next.length) {
                    level.push(next[i]);
                } else {
                    level.push(this.concat(next[i], next[i + 1]));
                }
            }
            next = level;
        }
    }
    getProof(index, next = this.leaves){
        let proof = [];
        while (true) {
            if (next.length <= 1) {
                return proof;
            }
            let level = [];
            for (let i = 0; i < next.length; i += 2) {
                if ((i + 1) >= next.length) {
                    level.push(next[i]);
                } else {
                    level.push(this.concat(next[i], next[i + 1]));
                    if (index === i || i === (index - 1)) {
                        if (index === i) {
                            proof.push({data:next[i + 1], left:false});
                        } else {
                            proof.push({data:next[i], left:true});
                        }
                    }
                }
            }
            index = Math.floor(index/2);
            next = level;
        }
    }
}

module.exports = MerkleTree;

点击运行。

5: Verify your Proof

查看要求:

输入:

function verifyProof(proof, node, root, concat) {
    let n = node;
    proof.forEach((e,_) => {
        if (e.left) {
            n = concat(e.data, n);
        } else {
            n = concat(n, e.data);
        }
    });

    if (n === root) {
        return true;
    } else {
        return false;
    }
}

module.exports = verifyProof;

点击运行。

Blockchain Data Storage

Learn Tries

1: Constructors

查看要求:

这里注意要改两个文件:

class TrieNode {
    constructor(key) {
        this.key = key;
        this.children = {};
        this.isWord = false;
    }
}

module.exports = TrieNode;
const TrieNode = require('./TrieNode');

class Trie {
    constructor() {
        this.root = new TrieNode(null);
    }
}

module.exports = Trie;

点击运行。

2: Insert

查看要求:

输入:

这里注意改第二个文件:

const TrieNode = require('./TrieNode');

class Trie {
    constructor() {
        this.root = new TrieNode(null);
    }

    insert(data) {
        let n = this.root;
        for (let i = 0; i < data.length; i++) {
            let node = new TrieNode(data[i]);
            n.children[data[i]] = node;
            if ((i + 1) === data.length) {
                node.isWord = true;
            }
            n = node;
        }
    }
}

module.exports = Trie;

点击运行。

3: Insert Branching

查看要求:

这里还是改这个文件:

输入:

const TrieNode = require('./TrieNode');

class Trie {
    constructor() {
        this.root = new TrieNode(null);
    }

    insert(data) {
        let n = this.root;
        for (let i = 0; i < data.length; i++) {
            let node = n.children[data[i]];
            if (! node) {
                node = new TrieNode(data[i]);
            }
            n.children[data[i]] = node;
            if ((i + 1) === data.length) {
                node.isWord = true;
            }
            n = node;
        }
    }
}

module.exports = Trie;

点击运行。

4: Contains

查看要求:

还是改这个文件,输入:

const TrieNode = require('./TrieNode');

class Trie {
    constructor() {
        this.root = new TrieNode(null);
    }

    insert(data) {
        let n = this.root;
        for (let i = 0; i < data.length; i++) {
            let node = n.children[data[i]];
            if (! node) {
                node = new TrieNode(data[i]);
            }
            n.children[data[i]] = node;
            if ((i + 1) === data.length) {
                node.isWord = true;
            }
            n = node;
        }
    }

    contains(word) {
        let n = this.root.children[word[0]];
        if (n === null) {
            return false;
        }
        let i = 1;
        while(n) {
            if (i >= word.length) {
                if (n.isWord) {
                    return true;
                } else {
                    return false;
                }
            }
            n = n.children[word[i]];
            if (n === null) {
                return false;
            }
            i = i + 1;
        }
    }
}

module.exports = Trie;

     

点击运行。

以上,Blockchain Storage,课程学习完成。

未完待续……

了解更多,请关注作者:https://twitter.com/bitc2024

Subscribe to 冰糖vs橙子
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.