avatarIvan Campos

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

3786

Abstract

arison operators, and bitwise operators on this type too.</p><p id="c4da">It’s important to note that there is another type, called <code>bytes</code> which is different from the above in that it is a dynamically sized array, and not a value type but a reference type. It is basically shorthand for <code>byte[]</code>.</p><p id="ad39">When you can limit the length of your data to a predefined amount of bytes, it is always good practice to use some of <code>bytes1</code> to <code>bytes32</code> because it is much cheaper.</p><h2 id="0118">Enums</h2><p id="aea7"><b>Enums</b> in Solidity are a way to create user-defined types. Enums are explicitly convertible to integer types, but not implicitly. Enum values are numbered in the order they are defined, starting from 0.</p><p id="ed00">Enums are not part of the ABI (Application Binary Interface — more on this in a later lesson, but it’s basically how you encode Solidity code for the Ethereum Virtual Machine, and how you get data back). This means that if your function returns an <code>enum</code> for example, it will be automatically converted to a <code>uint8</code> behind the scenes. The integer returned is just large enough to hold all enum values. With more values, the size gets increased too (<code>uint16</code> and up).</p><p id="cdb6">The below code, taken from the <a href="https://docs.soliditylang.org/en/v0.4.24/index.html">Solidity docs</a>, defines an enum with four possible values, creates a variable of that enum named <code>choice</code> and a constant called <code>defaultChoice</code>that will hold a default value.</p><div id="cf29"><pre><span class="hljs-keyword">enum</span> <span class="hljs-title class_">ActionChoices</span> { GoLeft, GoRight, GoStraight, SitStill } ActionChoices choice; ActionChoices <span class="hljs-type">constant</span> <span class="hljs-variable">defaultChoice</span> <span class="hljs-operator">=</span> ActionChoices.GoStraight;</pre></div><p id="66a9">Now we can define some functions to interact with our <code>enum</code>.</p><div id="c0bb"><pre><span class="hljs-title function_"><span class="hljs-keyword">function</span> <span class="hljs-title">setGoStraight</span></span>() <span class="hljs-keyword">public</span> { choice = ActionChoices.GoStraight; }

<span class="hljs-title function_"><span class="hljs-keyword">function</span> <span class="hljs-title">setChoice</span></span>(ActionChoices <span class="hljs-keyword">new</span><span class="hljs-type">Choice</span>) <span class="hljs-keyword">public</span> { choice = <span class="hljs-keyword">new</span><span class="hljs-type">Choice</span>; }</pre></div><p id="6bc2">The first one simply sets the <code>choice</code> to <code>GoStraight</code> while the second one sets it to the choice that the caller passes into the function. As we can see after deployment, the <code>setChoice</code> function expects a <code>uint8</code> value, which corresponds to the <code>enum</code> value declared at that number.</p><figure id="e997"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*1pKNPVy4UUBCSLi2-SIckg.png"><figcaption>Testing enums in Remix</figcaption></figure><p id="7917">If we want to get the value of <code>choice</code> and <code>defaultChoice</code>, we can define the following functions:</p><div id="1f02"><pre><span class="hljs-keyword">function</span> <span class="hljs-title">getChoice</span>() public view returns (ActionChoices) { <span class="hljs-keyword">return</span> <span class="hljs-type">choice</span>; }</pre></div><div id="43e7"><pre><span class="hljs-function">function <span class="hljs-title">getDefaultChoice</span>() <span class="hljs-keyword">public</span> pure <span class="hljs-title">returns</span> (<span class="hljs-params"><span class=

Options

"hljs-built_in">uint</span></span>)</span> { <span class="hljs-keyword">return</span> <span class="hljs-built_in">uint</span>(defaultChoice); }</pre></div><p id="c2f2">As we can see if we try this out in Remix, the first function returns a <code>uint8</code> while the second returns a <code>uint256</code>.</p><figure id="e514"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*jmaOFb9GhXz7FWC4ONMa_A.png"><figcaption>Testing enums in Remix</figcaption></figure><h2 id="3c7c">Fixed point numbers</h2><p id="2ecc"><b>Fixed point numbers </b>represent fractional numbers by storing a fixed number of digits of their fractional part. No matter how large or small the fractional part is, it will always use the same number of bits.</p><p id="cdcd" type="7">Fixed point numbers are not fully supported by Solidity yet. They can be declared, but cannot be assigned to or from.</p><p id="f872">We can differentiate between signed fixed point numbers, declared with the <code>fixed</code> keyword, and unsigned fixed point numbers, declared with the <code>ufixed</code> keyword.</p><p id="3c1c">It can also be declared as <code>fixedMxN</code> or <code>ufixedMxN</code> where <code>M</code> represents the number of bits the type takes, and <code>N</code> represents the number of decimal points. <code>M</code> has to be divisible by 8 and a number between 8 and 256. <code>N</code> has to be a number between 0 and 80.</p><p id="96e1">They function with the following operators:</p><ul><li>Comparisons: <code><=</code>, <code><</code>, <code>==</code>, <code>!=</code>, <code>>=</code>, <code>></code> (evaluate to <code>bool</code>)</li><li>Arithmetic operators: <code>+</code>, <code>-</code>, unary <code>-</code>, unary <code>+</code>, <code>*</code>, <code>/</code>, <code>%</code> (remainder)</li></ul><h2 id="09b7">Conclusion</h2><p id="bd3a">In this lesson, we looked at what value types are available in Solidity and how each one works.</p><p id="28de">Thank you for staying with us till the end. If you enjoyed reading this piece please keep in touch and follow Solidify to keep up with our lessons on Solidity. In the upcoming articles, we will deep dive into the intricacies of the language, progressing from beginner to advanced level.</p><p id="067c">If you are new to Solidity, check out the previous lessons about setting up a local development environment and writing your first smart contract.</p><div id="6b76" class="link-block"> <a href="https://readmedium.com/how-to-setup-your-local-solidity-development-environment-c4c8195810f3"> <div> <div> <h2>How to Setup Your Local Solidity Development Environment</h2> <div><h3>Get started with smart contract development</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*HHko-o9m1sVngmTeRVYgKA.jpeg)"></div> </div> </div> </a> </div><div id="3ad1" class="link-block"> <a href="https://readmedium.com/lesson-1-your-first-solidity-smart-contract-1ba7e641f9a3"> <div> <div> <h2>Lesson 1: Your First Solidity Smart Contract</h2> <div><h3>In the previous lesson, we looked at how to set up your local Solidity development environment. Here we will continue…</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*7r7HSYkbn73NrmR_skvh5w.jpeg)"></div> </div> </div> </a> </div></article></body>

ChatGPT API Pricing Comparison

The ChatGPT API (gpt-3.5-turbo) has been launched by OpenAI at a cost that is 10x cheaper than their flagship language model (text-davinci-003).

The introduction of the ChatGPT API by OpenAI has led to significant cost savings for developers looking for advanced language models. With a price that is 10x cheaper (90% lower cost) than the text-davinci-003 model, developers must now evaluate the benefits of switching their workloads and prompts to the ChatGPT API.

The lower cost will make it more accessible for developers looking to incorporate natural language processing into their applications without breaking the bank.

However, the decision to shift to the ChatGPT API cannot be based on cost alone. Developers must evaluate whether the API can deliver comparable responses to their specific use cases. While the ChatGPT API is significantly cheaper, it may not offer the same level of performance/capabilities as the text-davinci-003 model. Therefore, developers must carefully assess their requirements and compare the features of each model before making a decision.

Nevertheless, the lower cost of the ChatGPT API is a compelling reason for many developers to explore its capabilities and consider it as a viable alternative to the more expensive language models.

ChatGPT Plus

While the ChatGPT API is an attractive option for developers looking for a more affordable language model, the elephant in the room is ChatGPT Plus pricing.

At $20 USD per month, it is significantly more expensive than the ChatGPT API. This raises questions about whether this pricing creates an arbitrage opportunity for developers.

It is uncertain if OpenAI will maintain the current pricing for ChatGPT Plus. In my opinion, it is likely that the pricing will be revised soon to narrow the gap between ChatGPT API and ChatGPT Plus. This move could help OpenAI to attract more customers while providing greater flexibility to developers who need advanced natural language processing capabilities. However, only time will tell how OpenAI chooses to position its pricing strategy in response to the market demand and competitive landscape.

For $20 worth of the ChatGPT API, you can process about 7.5 Million words — or the length of ~10 King James Bibles.

ChatGPT API Completion Differences

ChatML

When prompting with the ChatGPT API, your prompts must be submitted in the form of messages with a role (either ‘system’, ‘user’, or ‘assistant’) and the content of the message.

messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the super bowl in 1973?"},
        {"role": "assistant", "content": "The Miami Dolphins won the Super Bowl in 1973."},
        {"role": "user", "content": "Where was it played?"}
    ]

This new structured structured format is called Chat Markup Language (ChatML).

ChatGPT API Python Notebook

This code is using the OpenAI API to generate a chat completion. It creates a new chat completion session with the “gpt-3.5-turbo” language model, which is a variant of the GPT-3 model that is optimized for generating chatbot responses.

The “messages” parameter is a list of messages exchanged between the user and the chatbot. Each message is represented by a dictionary with two keys: “role”, which indicates whether the message was sent by the user or the chatbot, and “content”, which contains the text of the message. In this case, the user has asked two questions about the Super Bowl, and the chatbot has provided answers to both questions.

Once the session is created, the API will generate a response to the last message in the list (“Where was it played?”) based on the context of the conversation so far. The response will be returned as a new message in the same format as the messages in the input list.

For text completions, we parse the response text out of response[‘choices’][0][‘text'] ;however, in chat completions, we now parse response[‘choices’][0][‘message’][‘content’].

Conclusion

In short, the ChatGPT API is disrupting ChatGPT Plus. This strategic maneuver is critical to maintaining first mover advantage as many large competitors are expected to enter the LLM market in the coming months.

With lower prices for developers, we can expect a flood of new and exciting products that will be infused with commoditized Artificial Intelligence. Get ready for an explosion of innovation that will transform the technology landscape and bring AI within reach for even more businesses and individuals. This is an exciting time to be in the world of tech, as the possibilities are endless and the potential for growth is immense. Let’s see what the future holds for this rapidly evolving field and get ready to ride the wave of change that is coming our way.

References

ChatGPT
OpenAI
AI
Artificial Intelligence
Ai Assisted Writing
Recommended from ReadMedium