Как развернуть смарт-контракты Ethereum с помощью web3

блокчейн Эфириум
Как развернуть смарт-контракты Ethereum с помощью web3

0x00 начало

Когда большинство людей изучают разработку смарт-контрактов, они выбираютremixРазработка и внедрение контрактов. remixустановленSolidityРедактор, компилятор и интегрированный инструмент разработки, развернутые в одном, очень удобны и очень просты в использовании. использовал раньшеRemixили truffle,Недавно использованныйweb3Разверните смарт-контракты и поделитесь ими.

0x01 Подготовка

в настоящее время используетweb3Для развертывания по контракту обычно необходимо подготовить следующие библиотеки:

1. раствор

solcЭто инструмент компиляции смарт-контрактов, разработанный на языке Solidity, официально выпущенный Ethereum.solcПолучите тот, который будет использоваться при развертывании контрактаbytecode и abi.

2. веб3.js

web3.jsЭто использование официальной реализации Ethereum.javascriptjs библиотека для взаимодействия с клиентом Ethereum,web3 .jsРаботает с любым узлом Ethereum, который предоставляет уровень RPC.

0x02 Использовать Solidity для написания кода смарт-контракта

В этой статье в основном обсуждается развертывание смарт-контракта web3 и не затрагивается обсуждение языка солидности, поэтому мы используем очень простой смарт-контракт, чтобы изучить следующее развертывание и записать свое имя в блокчейн:

  1. pragma solidity ^0.4.16;

  2. contract Name {

  3.    string public name;

  4.    // 构造函数 合约部署时执行

  5.    function Name(string _name) public {

  6.        name = _name;

  7.    }

  8.    // 获取名字

  9.    function getName() view public returns(string) {

  10.        return name;

  11.    }

  12. }

скопировать код

0x03 Использовать solcjs для компиляции смарт-контрактов

Если вы хотите использовать web3 для развертывания контракта, вам нужно сначала получить байт-код контракта и abi контракта, а для компиляции можно использовать solcjs.

  1. npm install -g solc

скопировать код

После успешной установки мы можем скомпилировать код через командную строку, чтобы получить код и abi.

  1. # 获得code

  2. solcjs --bin name.sol

  3. # 获的abi

  4. solcjs --abi name.sol

скопировать код

Внедрение 0x04 web3 перед развертыванием

1. Представьте web3.js

Вводитьweb3.jsЕсть два способа: один с использованием nodejs и один с использованием движка браузера напрямую.

nodejs
  1. npm install web3

скопировать код
Browser module
  1. # 项目中直接引入 `web3.min.js`

  2. bower install web3

скопировать код

2. Как пользоваться веб3

фактически web3для Эфириумаjson -rpcиспользование интерфейсаjavascriptПосле упаковки, так какrpc, когда мы его используем, мы должны подключиться к серверу, который поддерживает Ethereum.json -rpcузел. Здесь мы обычно подключаемjson -rpcУзлы называются внедряющими узлами Ethereum. Есть два способа внедрения узлов.

- Внедрить собственный узел или открытый узел

Для инъекций таким способом нам нужно построить собственную ноду и взаимодействовать с сетью Ethereum через нашу собственную ноду Код выглядит следующим образом:

  1. web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

скопировать код

один из них http://localhost:8545Это адрес вашего собственного узла, но поскольку объем данных полного узла Ethereum увеличивается, для синхронизации данных полного узла требуется очень много времени и большой объем жесткого диска, что очень проблематично для обычных пользователей. .

В настоящее время есть некоторые открытые поставщики услуг, которые предоставляют полные узлы и тестовые сетевые узлы.На самом деле, это проще в использовании.Вы можете не синхронизировать всю сеть Ethereum самостоятельно, и вам нужно только сосредоточиться на разработке собственных приложений для обеспечения служба узла. Эту услугу предоставляют многоцепочечные узлы в рамках технологии Multi-Chain.

  1. // 多链节点

  2. https://node.duolian.io/

скопировать код

- Используйте плагины для браузера, такие как MetaMask

MetaMask – это подключаемый модуль браузера для кошелька Ethereum. Этот подключаемый модуль предоставляет собственный экземпляр web3. Когда пользователь устанавливает MetaMask в браузере, MetaMask автоматически внедряет фрагмент js, а затем внедряет собственный экземпляр web3 в браузер. так что вы можете использовать этот экземпляр web3 напрямую. код показывает, как показано ниже:

  1. web3 = new Web3(web3.currentProvider);

скопировать код
Внедрить код web3

Когда в браузере уже есть экземпляр web3, то мы напрямую используем существующий экземпляр, а если его нет, подключаемся к собственному экземпляру web3.

  1. if (typeof web3 !== 'undefined') {

  2.  web3 = new Web3(web3.currentProvider);

  3. } else {

  4.  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

  5. }

скопировать код

0x05 Разверните контракт через web3

Код и abi контракта получены через solcjs, и web3 успешно внедряется в браузер.На данный момент нам нужно только развернуть контракт через web3.

  1. var _name = /* var of type string here */ ;

  2. var nameContract = web3.eth.contract("使用solcjs编译获得的abi");

  3. var name = nameContract.new(

  4.   _name,

  5.   {

  6.     from: web3.eth.accounts[0],

  7.     data: '使用solc编译获得的code',

  8.     gas: '4700000'

  9.   }, function (e, contract){

  10.    console.log(e, contract);

  11.    if (typeof contract.address !== 'undefined') {

  12.         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);

  13.    }

  14. })

скопировать код

0x06 Окончательный код

Поскольку в этой статье используется экземпляр web3 MetaMask во время развертывания, поскольку web3 MetaMask не поддерживает синхронные вызовы, код при создании экземпляра web3 отличается, и соответствующий код js выглядит следующим образом:

  1. var Web3 = require('web3');

  2. getWeb3 = new Promise(function(resolve) {

  3.    window.addEventListener('load', function() {

  4.        var results;

  5.        var web3 = window.web3;

  6.        if (typeof web3 !== 'undefined') {

  7.            // Use Mist/MetaMask's provider.

  8.            web3 = new Web3(web3.currentProvider);

  9.            results = {

  10.                web3: web3

  11.            };

  12.            console.log('Injected web3 detected.');

  13.            resolve(results);

  14.        } else {

  15.            alert('请安装MetaMask插件并解锁您的以太坊账户');

  16.        }

  17.    })

  18. });

  19. var web3;

  20. getWeb3.then(function(results) {

  21.    web3 = results.web3;

  22. });

  23. // 部署的方法

  24. function deploy()

  25. {

  26.    var _name = "二话区块链" ;

  27.    var nameContract = web3.eth.contract(使用solc编译获得的abi);

  28.    var name = nameContract.new(

  29.        _name,

  30.        {

  31.            from: web3.eth.accounts[0],

  32.            data: '使用solc编译获得的code',

  33.            gas: '288628',

  34.            gasPrice: 4

  35.        }, function (e, contract){

  36.            console.log(e, contract);

  37.            if (e !== 'undefined') {

  38.                if (typeof contract.address !== 'undefined') {

  39.                    console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);

  40.                } else {

  41.                    console.log('Contract mined! transactionHash: ' + contract.transactionHash);

  42.                }

  43.            }

  44.        });

  45. }

скопировать код

Спасибо за вашу поддержку, если вы думаете, что это хорошо, пожалуйста, перешлите его~

Если тебе это нравится, не говори, просканируй меня~