成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一步步構(gòu)建自己的智能合約

kaka / 2460人閱讀

摘要:狀態(tài)變量是被永久地保存在合約中。如何定義一個(gè)私有的函數(shù)呢這意味著只有我們合約中的其它函數(shù)才能夠調(diào)用這個(gè)函數(shù),給數(shù)組添加新成員。事件事件事件我們的合約幾乎就要完成了讓我們加上一個(gè)事件事件是合約和區(qū)塊鏈通訊的一種機(jī)制。

大愛(ài)loom!大愛(ài)loom!內(nèi)容整理自loom僵尸小游戲課程

一、合約

所有的 Solidity 源碼都必須冠以 "version pragma" — 標(biāo)明 Solidity 編譯器的版本. 以避免將來(lái)新的編譯器可能破壞你的代碼。

例如: pragma solidity ^0.4.19; (當(dāng)前 Solidity 的最新版本是 0.4.19).

綜上所述, 下面就是一個(gè)最基本的合約 — 每次建立一個(gè)新的項(xiàng)目時(shí)的第一段代碼:

pragma solidity ^0.4.19;

contract HelloWorld {

}

為了建立我們的僵尸部隊(duì), 讓我們先建立一個(gè)基礎(chǔ)合約,稱為?ZombieFactory

pragma solidity ^0.4.19;

contract ZombieFactory {
    
}

!我們已經(jīng)為我們的合約做了一個(gè)外殼, 下面學(xué)習(xí) Solidity 中如何使用變量。

狀態(tài)變量是被永久地保存在合約中。也就是說(shuō)它們被寫入以太幣區(qū)塊鏈中. 想象成寫入一個(gè)數(shù)據(jù)庫(kù)。

無(wú)符號(hào)整數(shù): uint

uint 無(wú)符號(hào)數(shù)據(jù)類型, 指其值不能是負(fù)數(shù),對(duì)于有符號(hào)的整數(shù)存在名為 int的數(shù)據(jù)類型。

注: Solidity中, uint 實(shí)際上是 uint256代名詞, 一個(gè)256位的無(wú)符號(hào)整數(shù)。你也可以定義位數(shù)少的uints — uint8, uint16, uint32, 等

我們的僵尸DNA將由一個(gè)十六位數(shù)字組成。

pragma solidity ^0.4.19;

contract ZombieFactory {
    uint dnaDigits = 16;
}
1.1 數(shù)值運(yùn)算

在 Solidity 中,數(shù)學(xué)運(yùn)算很直觀明了,與其它程序設(shè)計(jì)語(yǔ)言相同:

加法: x + y

減法: x - y,

乘法: x * y

除法: x / y

取模 / 求余: x % y (例如, 13 % 5 余 3, 因?yàn)?3除以5,余3)

Solidity 還支持 乘方操作 (如:x 的 y次方) // 例如: 5 ** 2 = 25

uint x = 5 ** 2; // equal to 5^2 = 25

為了保證我們的僵尸的DNA只含有16個(gè)字符,我們先造一個(gè)uint數(shù)據(jù),讓它等于10^16。這樣一來(lái)以后我們可以用模運(yùn)算符?%?把一個(gè)整數(shù)變成16位。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;
}
1.2 結(jié)構(gòu)體

有時(shí)你需要更復(fù)雜的數(shù)據(jù)類型,Solidity 提供了 結(jié)構(gòu)體:

struct Person {
  uint age;
  string name;
}

結(jié)構(gòu)體允許你生成一個(gè)更復(fù)雜的數(shù)據(jù)類型,它有多個(gè)屬性。

注:我們剛剛引進(jìn)了一個(gè)新類型, string。 字符串用于保存任意長(zhǎng)度的 UTF-8 編碼數(shù)據(jù)。 如: string greeting = "Hello world!"

在我們的程序中,我們將創(chuàng)建一些僵尸!每個(gè)僵尸將擁有多個(gè)屬性,所以這是一個(gè)展示結(jié)構(gòu)體的完美例子。 solidity中的結(jié)構(gòu)體要聲明在contract內(nèi)部

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    // 這里開(kāi)始
    struct Zombie {
        string name;
        uint dna;
    }
}
1.3 數(shù)組

如果你想建立一個(gè)集合,可以用 數(shù)組這樣的數(shù)據(jù)類型. Solidity 支持兩種數(shù)組: 靜態(tài) 數(shù)組和動(dòng)態(tài) 數(shù)組:

// 固定長(zhǎng)度為2的靜態(tài)數(shù)組:
uint[2] fixedArray;
// 固定長(zhǎng)度為5的string類型的靜態(tài)數(shù)組:
string[5] stringArray;
// 動(dòng)態(tài)數(shù)組,長(zhǎng)度不固定,可以動(dòng)態(tài)添加元素:
uint[] dynamicArray;

你也可以建立一個(gè) 結(jié)構(gòu)體類型的數(shù)組 例如,上一章提到的 Person:

Person[] people; // dynamic Array, we can keep adding to it

記住:狀態(tài)變量被永久保存在區(qū)塊鏈中。所以在你的合約中創(chuàng)建動(dòng)態(tài)數(shù)組來(lái)保存成結(jié)構(gòu)的數(shù)據(jù)是非常有意義的。

公共數(shù)組

你可以定義 public 數(shù)組, Solidity 會(huì)自動(dòng)創(chuàng)建 getter 方法. 語(yǔ)法如下:

Person[] public people;

其它的合約可以從這個(gè)數(shù)組讀取數(shù)據(jù)(但不能寫入數(shù)據(jù)),所以這在合約中是一個(gè)有用的保存公共數(shù)據(jù)的模式。

為了把一個(gè)僵尸部隊(duì)保存在我們的APP里,并且能夠讓其它APP看到這些僵尸,我們需要一個(gè)公共數(shù)組。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;
}
1.4 定義函數(shù)

在 Solidity 中函數(shù)定義的句法如下:

function eatHamburgers(string _name, uint _amount) {

}

這是一個(gè)名為 eatHamburgers 的函數(shù),它接受兩個(gè)參數(shù):一個(gè) string類型的 和 一個(gè) uint類型的?,F(xiàn)在函數(shù)內(nèi)部還是空的。

注:: 習(xí)慣上函數(shù)里的變量都是以(_)開(kāi)頭 (但不是硬性規(guī)定) 以區(qū)別全局變量。我們整個(gè)教程都會(huì)沿用這個(gè)習(xí)慣。

我們的函數(shù)定義如下:

eatHamburgers("vitalik", 100);

在我們的應(yīng)用里,我們要能創(chuàng)建一些僵尸,讓我們寫一個(gè)函數(shù)做這件事吧!

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        uint dna;
        string name;
    }

    Zombie[] public zombies;

    function createZombie(string _name, uint _dna) {
        
    }
}
1.5 創(chuàng)建新的結(jié)構(gòu)體

還記得上個(gè)例子中的 Person 結(jié)構(gòu)嗎?

struct Person {
  uint age;
  string name;
}

Person[] public people;

現(xiàn)在我們學(xué)習(xí)創(chuàng)建新的 Person 結(jié)構(gòu),然后把它加入到名為 people 的數(shù)組中.

// 創(chuàng)建一個(gè)新的Person:
Person satoshi = Person(172, "Satoshi");

// 將新創(chuàng)建的satoshi添加進(jìn)people數(shù)組:
people.push(satoshi);

你也可以兩步并一步,用一行代碼更簡(jiǎn)潔:

people.push(Person(16, "Vitalik"));
注:array.push() 在數(shù)組的 尾部 加入新元素 ,所以元素在數(shù)組中的順序就是我們添加的順序, 如:
uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// numbers is now equal to [5, 10, 15]

讓我們創(chuàng)建名為createZombie的函數(shù)來(lái)做點(diǎn)兒什么吧。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function createZombie(string _name, uint _dna) {
        // 這里開(kāi)始
        Zombie z = Zombie(_name, _dna);
        zombies.push(z);
    }

}
1.6 私有 / 公共函數(shù)

Solidity 定義的函數(shù)的屬性默認(rèn)為公共。 這就意味著任何一方 (或其它合約) 都可以調(diào)用你合約里的函數(shù)。

顯然,不是什么時(shí)候都需要這樣,而且這樣的合約易于受到攻擊。 所以將自己的函數(shù)定義為私有是一個(gè)好的編程習(xí)慣,只有當(dāng)你需要外部世界調(diào)用它時(shí)才將它設(shè)置為公共。

如何定義一個(gè)私有的函數(shù)呢?

uint[] numbers;

function _addToArray(uint _number) private {
  numbers.push(_number);
}

這意味著只有我們合約中的其它函數(shù)才能夠調(diào)用這個(gè)函數(shù),給 numbers 數(shù)組添加新成員。

可以看到,在函數(shù)名字后面使用關(guān)鍵字 private 即可。和函數(shù)的參數(shù)類似,私有函數(shù)的名字用(_)起始。

我們合約的函數(shù)?createZombie?的默認(rèn)屬性是公共的,這意味著任何一方都可以調(diào)用它去創(chuàng)建一個(gè)僵尸。 咱們來(lái)把它變成私有吧!

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

}
1.7 函數(shù)的更多屬性

本章中我們將學(xué)習(xí)函數(shù)的返回值和修飾符。

返回值

要想函數(shù)返回一個(gè)數(shù)值,按如下定義:

string greeting = "What"s up dog";

function sayHello() public returns (string) {
  return greeting;
}

Solidity 里,函數(shù)的定義里可包含返回值的數(shù)據(jù)類型(如本例中 string)。

函數(shù)的修飾符

上面的函數(shù)實(shí)際上沒(méi)有改變 Solidity 里的狀態(tài),即,它沒(méi)有改變?nèi)魏沃祷蛘邔懭魏螙|西。

這種情況下我們可以把函數(shù)定義為 view, 意味著它只能讀取數(shù)據(jù)不能更改數(shù)據(jù):

function sayHello() public view returns (string) {

Solidity 還支持 pure 函數(shù), 表明這個(gè)函數(shù)甚至都不訪問(wèn)應(yīng)用里的數(shù)據(jù),例如:

function _multiply(uint a, uint b) private pure returns (uint) {
  return a * b;
}

這個(gè)函數(shù)甚至都不讀取應(yīng)用里的狀態(tài) — 它的返回值完全取決于它的輸入?yún)?shù),在這種情況下我們把函數(shù)定義為 pure.

注:可能很難記住何時(shí)把函數(shù)標(biāo)記為 pure/view。 幸運(yùn)的是, Solidity 編輯器會(huì)給出提示,提醒你使用這些修飾符。

我們想建立一個(gè)幫助函數(shù),它根據(jù)一個(gè)字符串隨機(jī)生成一個(gè)DNA數(shù)據(jù)。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }
    
    function _generateRandomDna(string _str) private view returns (uint) {
        
    }
}
1.8 Keccak256 和 類型轉(zhuǎn)換

如何讓 _generateRandomDna 函數(shù)返回一個(gè)全(半) 隨機(jī)的 uint?

Ethereum 內(nèi)部有一個(gè)散列函數(shù)keccak256,它用了SHA3版本。一個(gè)散列函數(shù)基本上就是把一個(gè)字符串轉(zhuǎn)換為一個(gè)256位的16進(jìn)制數(shù)字。字符串的一個(gè)微小變化會(huì)引起散列數(shù)據(jù)極大變化。

這在 Ethereum 中有很多應(yīng)用,但是現(xiàn)在我們只是用它造一個(gè)偽隨機(jī)數(shù)。

例子:

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

顯而易見(jiàn),輸入字符串只改變了一個(gè)字母,輸出就已經(jīng)天壤之別了。

注: 在區(qū)塊鏈中安全地產(chǎn)生一個(gè)隨機(jī)數(shù)是一個(gè)很難的問(wèn)題, 本例的方法不安全,但是在我們的Zombie DNA算法里不是那么重要,已經(jīng)很好地滿足我們的需要了。
類型轉(zhuǎn)換

有時(shí)你需要變換數(shù)據(jù)類型。例如:

uint8 a = 5;
uint b = 6;
// 將會(huì)拋出錯(cuò)誤,因?yàn)?a * b 返回 uint, 而不是 uint8:
uint8 c = a * b;
// 我們需要將 b 轉(zhuǎn)換為 uint8:
uint8 c = a * uint8(b);

上面, a * b 返回類型是 uint, 但是當(dāng)我們嘗試用 uint8 類型接收時(shí), 就會(huì)造成潛在的錯(cuò)誤。如果把它的數(shù)據(jù)類型轉(zhuǎn)換為 uint8, 就可以了,編譯器也不會(huì)出錯(cuò)。

_generateRandomDna 函數(shù)添加代碼! 它應(yīng)該完成如下功能:

第一行代碼取 _strkeccak256 散列值生成一個(gè)偽隨機(jī)十六進(jìn)制數(shù),類型轉(zhuǎn)換為 uint, 最后保存在類型為 uint 名為 rand 的變量中。

我們只想讓我們的DNA的長(zhǎng)度為16位 (還記得 dnaModulus?)。所以第二行代碼應(yīng)該 return 上面計(jì)算的數(shù)值對(duì) dnaModulus 求余數(shù)(%)。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

}
1.9 放在一起

我們就快完成我們的隨機(jī)僵尸制造器了,來(lái)寫一個(gè)公共的函數(shù)把所有的部件連接起來(lái)。

寫一個(gè)公共函數(shù),它有一個(gè)參數(shù),用來(lái)接收僵尸的名字,之后用它生成僵尸的DNA。

創(chuàng)建一個(gè) public 函數(shù),命名為createRandomZombie. 它將被傳入一個(gè)變量 _name (數(shù)據(jù)類型是 string)。 (注: 定義公共函數(shù) public 和定義一個(gè)私有 private 函數(shù)的做法一樣)

函數(shù)的第一行應(yīng)該調(diào)用 _generateRandomDna 函數(shù),傳入 _name 參數(shù), 結(jié)果保存在一個(gè)類型為 uint 的變量里,命名為 randDna。

第二行調(diào)用 _createZombie 函數(shù), 傳入?yún)?shù): _namerandDna。

整個(gè)函數(shù)應(yīng)該是4行代碼 (包括函數(shù)的結(jié)束符號(hào) } )。

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    // 事件
    pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    // 事件
    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }   
}
1.10 : 事件

我們的合約幾乎就要完成了!讓我們加上一個(gè)事件.

事件 是合約和區(qū)塊鏈通訊的一種機(jī)制。你的前端應(yīng)用“監(jiān)聽(tīng)”某些事件,并做出反應(yīng)。

例子:

// 這里建立事件
event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
  //觸發(fā)事件,通知app
  IntegersAdded(_x, _y, result);
  return result;
}

你的 app 前端可以監(jiān)聽(tīng)這個(gè)事件。JavaScript 實(shí)現(xiàn)如下:

YourContract.IntegersAdded(function(error, result) { 
  // 干些事
}

我們想每當(dāng)一個(gè)僵尸創(chuàng)造出來(lái)時(shí),我們的前端都能監(jiān)聽(tīng)到這個(gè)事件,并將它顯示出來(lái)。

1。 定義一個(gè) 事件 叫做 NewZombie。 它有3個(gè)參數(shù): zombieId (uint), name (string), 和 dna (uint)。

2。 修改 _createZombie 函數(shù)使得當(dāng)新僵尸造出來(lái)并加入zombies數(shù)組后,生成事件NewZombie。

3。 需要定義僵尸idarray.push() 返回?cái)?shù)組的長(zhǎng)度類型是uint - 因?yàn)閿?shù)組的第一個(gè)元素的索引是 0, array.push() - 1 將是我們加入的僵尸的索引。 zombies.push() - 1 就是 id,數(shù)據(jù)類型是 uint。在下一行中你可以把它用到 NewZombie 事件中。

pragma solidity ^0.4.19;

contract ZombieFactory {

    // 這里建立事件
    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        // 這里觸發(fā)事件
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }
}

二、支持多用戶啦! 2.1 映射(Mapping)和地址(Address)

我們通過(guò)給數(shù)據(jù)庫(kù)中的僵尸指定“主人”, 來(lái)支持“多玩家”模式。

如此一來(lái),我們需要引入2個(gè)新的數(shù)據(jù)類型:mapping(映射) 和 address(地址)。

Addresses (地址)

以太坊區(qū)塊鏈由 account (賬戶)組成,你可以把它想象成銀行賬戶。一個(gè)帳戶的余額是 以太 (在以太坊區(qū)塊鏈上使用的幣種),你可以和其他帳戶之間支付和接受以太幣,就像你的銀行帳戶可以電匯資金到其他銀行帳戶一樣。

每個(gè)帳戶都有一個(gè)“地址”,你可以把它想象成銀行賬號(hào)。這是賬戶唯一的標(biāo)識(shí)符,它看起來(lái)長(zhǎng)這樣:

0x21110f92fd4e5b09d1237e6d30a2a8d733cd154b

(如果你喜歡本課程的話,請(qǐng)打賞我一些以太幣!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24059.html

相關(guān)文章

  • 步步教你開(kāi)發(fā)、部署第個(gè)去中心化應(yīng)用(Dapp) - 寵物商店

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接一步步教你開(kāi)發(fā)部署第一個(gè)去中心化應(yīng)用寵物商店原文已更新,請(qǐng)讀者前往原文閱讀今天我們來(lái)編寫一個(gè)完整的去中心化區(qū)塊鏈應(yīng)用本文可以和編寫智能合約結(jié)合起來(lái)看。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:一步步教你開(kāi)發(fā)、部署第一個(gè)去中心化應(yīng)用(Dapp) - 寵物商店原文已更新,請(qǐng)讀者前往原文閱讀 今天我們來(lái)編寫一個(gè)完整的去中心化(區(qū)塊鏈)應(yīng)用(Dapps), 本...

    vibiu 評(píng)論0 收藏0
  • 步步教你創(chuàng)建自己數(shù)字貨幣(代幣)進(jìn)行ICO

    摘要:利用以太坊的智能合約可以輕松編寫出屬于自己的代幣,代幣可以代表任何可以交易的東西,如積分財(cái)產(chǎn)證書等等。要求我們?cè)趯?shí)現(xiàn)代幣的時(shí)候必須要遵守的協(xié)議,如指定代幣名稱總量實(shí)現(xiàn)代幣交易函數(shù)等,只有支持了協(xié)議才能被以太坊錢包支持。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:創(chuàng)建自己的數(shù)字貨幣(ERC20 代幣)進(jìn)行 ICO原文已更新,請(qǐng)讀者前往原文閱讀 本文從技術(shù)角度詳細(xì)介紹如何基于以太坊ERC20創(chuàng)...

    EddieChan 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.41 - 深入學(xué)習(xí)區(qū)塊鏈

    摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計(jì)十分靈活,極具適應(yīng)性。超級(jí)賬本區(qū)塊鏈的商業(yè)應(yīng)用超級(jí)賬本超級(jí)賬本是基金會(huì)下的眾多項(xiàng)目中的一個(gè)。證書頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開(kāi)始 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會(huì)比較科普,盡量用類比的方法將比特幣的基本原理講出來(lái)...

    qianfeng 評(píng)論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開(kāi)發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來(lái)越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評(píng)論0 收藏0
  • 不用 WASM,我們從頭造輪子!采用 RISC-V 設(shè)計(jì)區(qū)塊鏈虛擬機(jī) CKB-VM 誕生記

    摘要:在區(qū)塊鏈上,虛擬機(jī)就是智能合約的運(yùn)行環(huán)境,是一個(gè)可以完全對(duì)外隔離的完整計(jì)算機(jī)體系。區(qū)塊鏈通過(guò)虛擬機(jī)來(lái)調(diào)用和執(zhí)行智能合約,并要求所有節(jié)點(diǎn)都達(dá)成一致。 秘猿科技使命是用技術(shù)創(chuàng)造信任,為價(jià)值網(wǎng)絡(luò)提供基礎(chǔ)設(shè)施和服務(wù)。為了實(shí)現(xiàn)這個(gè)使命,我們?nèi)陙?lái)堅(jiān)持初心,步步為營(yíng)打造加密經(jīng)濟(jì)網(wǎng)絡(luò)。我們想要讓互聯(lián)網(wǎng)回歸到本源,用區(qū)塊鏈技術(shù),去構(gòu)造更美好的社會(huì),因此我們?cè)O(shè)計(jì)了 CKB 底層公鏈。我們自己造輪子,開(kāi)創(chuàng)...

    joywek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<