Coder Social home page Coder Social logo

compra-remota-segura's Introduction

Compra remota segura

Este es un ejemplo de un contrato inteligente hecho con vyper, para la realización de una compra segura de un articulo, servicio u otros.

Instalación

Antes que todo debemos tener instalado python dentro de nuestro equipo.

  • Creación del entorno de desarrollo

    $ python3 -m venv venv 
    
  • Activación del entorno de desarrollo

    Ubuntu/MacOs:

    $ . venv/bin/activate
    

    Windows:

    $ venv/scripts/activate
    
  • Instalación de dependencias

    Instalamos vyper:

    $ pip install vyper
    

    Instalamos dependencias y/o librerías

    $ pip install 'web3[tester]' 
    $ pip install ipython
    

Compilación

Con la ayuda de la librería vyper, podemos compilar nuestros contratos haciendo uso del binario o el binario mas el ABI.

  • Compilando el binario (Bytecode):

    Dentro de nuestra consola usamos los siguiente comandos:

    $ vyper safe-remote-purchase.vy > bytecode.bin
    $ vyper -f abi safe-remote-purchase.vy > abi.json
    

Con esos comandos sea crean el bytecode y el ABI

Despliegue

Para el despliegue haremos uso de ipython, que es un editor iteractivo en consola y nos ayudará a completar nuestra linea de código.

$ ipython

Luego en la consola de ipython podemos ejecutar código de python, y en este caso haremos uso de la librería web3

Hacemos nuestras importaciones

import json
from web3 import Web3

Conexión

# w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
w3 = Web3(Web3.EthereumTesterProvider())
w3.isConnected() # Debe retornar un True

Verificación cuentas y balances

# Verificamos la listas de cuentas
w3.eth.accounts
# Para conocer la cantidad en cada cuenta (0 - 9)
w3.eth.getBalance(w3.eth.accounts[0])

# Información del último bloque
w3.eth.getBlock('latest')

Referenciar cuentas

# Referenciamos las cuentas por medio de variables
acct_one = w3.eth.accounts[0]
acct_two = w3.eth.accounts[1]
acct_three = w3.eth.accounts[2]

# Este número corresponde a los wei
w3.eth.getBalance(acct_one) # Balance cuenta 1
w3.eth.getBalance(acct_two) # Balance cuenta 2
w3.eth.getBalance(acct_three) # Balance cuenta 3

# Para ver cuantos ether son, usamos la función de toWei
Web3.toWei(w3.eth.getBalance(acct_three), "ether")

Despliegue de contrato

# Obtenemos nuestro bytecode del archivo
bytecode_file = open ('bytecode.bin','r')
bytecode = bytecode_file.read()
bytecode = bytecode[2:-1]
bytcode

# Obtenemos nuestra abi del archivo
abi_file = open('abi.json', 'r')
abi = json.loads(abi_file.read())
abi

# Creamos el contrato 

# Precio del articulo 5 ether

tx_hash = SafePurchase.constructor().transact(
    {'from': acct_one,
    'value': w3.toWei(10, 'ether')})

# Verificamos la transacción

w3.eth.getTransaction(tx_hash)

# Esperamos a que la transacción sea minada, y se obtenemos la recepción de la transacción

tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)

# Corroboramos el saldo de nuestro vendedor

w3.eth.get_balance(acct_one)

# Creamos el objeto para interactuar con nuestro contrato

safe_purchase = w3.eth.contract(
    address=tx_receipt.contractAddress,
    abi=abi )

# Ahora el objeto safe_purchase tiene las funciones con las que debemos interactuar

# Hacemos la compra del articulo con una dirección diferenta a la del propietario
# acct_two => comprador
safe_purchase.functions.purchase().transact({'from': acct_two, 'value': w3.toWei(10, 'ether')})

# El siguiente comando debe generarnos un error
safe_purchase.functions.purchase().transact({'from': acct_three, 'value': w3.toWei(10, 'ether')})

w3.eth.get_balance(acct_two) # cuenta del comprador
w3.eth.get_balance(acct_three) # cuenta del que quiso comprar y no pudo

# Aceptamos la recepción del articulo
safe_purchase.functions.received().transact({'from': acct_two})

# Final del ejercicio

compra-remota-segura's People

Contributors

juanb3r avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.