Skip to content

Commit

Permalink
Merge pull request #67 from bnb-chain/rc-v0.6.1
Browse files Browse the repository at this point in the history
Release v0.6.1
  • Loading branch information
alplabin authored May 13, 2024
2 parents acb52af + a74c786 commit 23dfd1f
Show file tree
Hide file tree
Showing 32 changed files with 1,202 additions and 936 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Changelog
=========

0.6.1 - 2024-5-13
-------

- Upgrade dependencies
- Remove ecdsa dependency
- Update transaction signature format
- Add multi message transaction support

0.6.0 - 2024-04-22
-------

Expand Down
6 changes: 3 additions & 3 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

## Blockchain

- [ ] Build_tx move custom type_url messages editions to other file (sp_approval)
- [X] `Build_tx` move custom type_url messages editions to other file (sp_approval)
- [ ] Add broadcast mode to `blockchain_client.broadcast_raw_tx`
- [ ] `convert_value_to_json` move custom type_url messages editions to other file
- [ ] `get_signature` move custom type_url messages editions to other file
- [X] `convert_value_to_json` move custom type_url messages editions to other file
- [X] `get_signatures` move custom type_url messages editions to other file

## Storage Provider

Expand Down
17 changes: 9 additions & 8 deletions examples/basic_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ async def main():
sp = await blockchain_client.sp.get_first_in_service_storage_provider()
primary_sp_address = sp["operator_address"]

async with StorageClient(key_manager=key_manager, sp_endpoints=sp_endpoints) as client:
async with StorageClient(network_configuration=network_configuration, key_manager=key_manager, sp_endpoints=sp_endpoints) as client:
bucket_name = "".join(random.choices(string.ascii_lowercase + string.digits, k=random.randint(5, 11)))
object_name = "".join(random.choices(string.ascii_lowercase + string.digits, k=random.randint(5, 11)))

Expand All @@ -62,13 +62,13 @@ async def main():

## Create the Bucket
await blockchain_client.broadcast_message(
message=bucket_approval, type_url=CREATE_BUCKET, broadcast_option=BroadcastOption(sp_signature=sp_signature)
messages=[bucket_approval], type_url=[CREATE_BUCKET], broadcast_option=BroadcastOption(sp_signature=sp_signature)
)
await asyncio.sleep(5)

# logger.info(f"---> List Buckets <---")
# list_bucket = await client.bucket.list_buckets(sp_address=sp_address)
# logger.info(f"Response: {list_bucket}\n\n")
list_bucket = await client.bucket.list_buckets(sp_address=primary_sp_address)
logger.info(f"Response: {list_bucket}\n\n")

logger.info(f"---> Bucket Read Quota <---")

Expand Down Expand Up @@ -99,13 +99,14 @@ async def main():
primary_sp_address=primary_sp_address,
reader=content,
storage_params=storage_params,
is_serial_compute_mode="False"
)
logger.info(f"Response:\n - Object Approval: {object_approval}\n - Storage Provider signature: {sp_signature}\n - Checksums: {checksums} \n\n")

## Create the Object
await blockchain_client.broadcast_message(
message=object_approval,
type_url=CREATE_OBJECT,
messages=[object_approval],
type_url=[CREATE_OBJECT],
broadcast_option=BroadcastOption(sp_signature=sp_signature, checksums=checksums),
)
await asyncio.sleep(5)
Expand Down Expand Up @@ -148,12 +149,12 @@ async def main():
delete_object_msg = MsgDeleteObject(
operator=key_manager.address, bucket_name=bucket_name, object_name=object_name
)
await blockchain_client.broadcast_message(message=delete_object_msg, type_url=DELETE_OBJECT)
await blockchain_client.broadcast_message(messages=[delete_object_msg], type_url=[DELETE_OBJECT])
await asyncio.sleep(5)

## Delete the Bucket
delete_bucket_msg = MsgDeleteBucket(operator=key_manager.address, bucket_name=bucket_name)
await blockchain_client.broadcast_message(message=delete_bucket_msg, type_url=DELETE_BUCKET)
await blockchain_client.broadcast_message(messages=[delete_bucket_msg], type_url=[DELETE_BUCKET])
await asyncio.sleep(5)


Expand Down
49 changes: 22 additions & 27 deletions greenfield_python_sdk/blockchain_client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import base64
from typing import Optional
from typing import List, Optional

import aiohttp
from betterproto import Casing
Expand All @@ -20,8 +19,6 @@
from greenfield_python_sdk.config import NetworkConfiguration
from greenfield_python_sdk.key_manager import KeyManager
from greenfield_python_sdk.models.broadcast import BroadcastMode
from greenfield_python_sdk.models.eip712_messages.storage.bucket_url import CREATE_BUCKET, MIGRATE_BUCKET
from greenfield_python_sdk.models.eip712_messages.storage.object_url import CREATE_OBJECT
from greenfield_python_sdk.models.transaction import BroadcastOption
from greenfield_python_sdk.protos.cosmos.base.v1beta1 import Coin
from greenfield_python_sdk.protos.cosmos.crypto.secp256k1 import PubKey
Expand All @@ -35,7 +32,7 @@
Tx,
TxBody,
)
from greenfield_python_sdk.sign_utils import get_signature
from greenfield_python_sdk.utils.sign_utils import encode_sp_approval_message, get_signatures


class BlockchainClient:
Expand Down Expand Up @@ -82,8 +79,8 @@ def connected(self) -> bool:

async def build_tx(
self,
message,
type_url: str,
messages,
type_url: List[str],
fee: Optional[Fee] = None,
) -> Tx:
if not self.key_manager:
Expand All @@ -96,20 +93,18 @@ async def build_tx(
gas_limit=2000,
payer=self.key_manager.address,
)
if type_url == CREATE_BUCKET or type_url == CREATE_OBJECT: # TODO: Move to other place
sp_approval = base64.b64decode(message.primary_sp_approval.sig)
message.primary_sp_approval.sig = bytes(sp_approval)

if type_url == MIGRATE_BUCKET:
sp_approval = base64.b64decode(message.dst_primary_sp_approval.sig)
message.dst_primary_sp_approval.sig = bytes(sp_approval)

wrapped_message = AnyMessage(
type_url=type_url,
value=bytes(message),
)
messages = encode_sp_approval_message(messages, type_url)
wrapped_message = []
for i in range(len(messages)):
wrapped_message.append(
AnyMessage(
type_url=type_url[i],
value=bytes(messages[i]),
)
)

body = TxBody(messages=[wrapped_message])
body = TxBody(messages=wrapped_message)
auth_info = AuthInfo(
signer_infos=[
SignerInfo(
Expand Down Expand Up @@ -161,14 +156,14 @@ async def broadcast_raw_tx(self, tx_bytes: bytes, mode: BroadcastMode = Broadcas

async def build_tx_from_message(
self,
message,
type_url: str,
messages,
type_url: List[str],
fee: Optional[Fee] = None,
broadcast_option: Optional[BroadcastOption] = None,
):
tx = await self.build_tx(message=message, type_url=type_url, fee=fee)
tx = await self.build_tx(messages=messages, type_url=type_url, fee=fee)

signature_pre = await get_signature(self.key_manager, tx, message, self.chain_id, broadcast_option)
signature_pre = await get_signatures(self.key_manager, tx, messages, self.chain_id, broadcast_option)
tx.signatures = [signature_pre]
try:
simulation = await self.simulate_tx(tx)
Expand All @@ -182,19 +177,19 @@ async def build_tx_from_message(
tx.auth_info.fee.gas_limit = 20000000
tx.auth_info.fee.amount[0].amount = "100000000000000000"

signature = await get_signature(self.key_manager, tx, message, self.chain_id, broadcast_option)
signature = await get_signatures(self.key_manager, tx, messages, self.chain_id, broadcast_option)
tx.signatures = [signature]
return tx

async def broadcast_message(
self,
message,
type_url: str,
messages,
type_url: List[str],
fee: Optional[Fee] = None,
broadcast_option: Optional[BroadcastOption] = None,
):
tx = await self.build_tx_from_message(
message=message,
messages=messages,
type_url=type_url,
fee=fee,
broadcast_option=broadcast_option,
Expand Down
6 changes: 3 additions & 3 deletions greenfield_python_sdk/greenfield/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ async def create_payment_account(self, address: str, fee=None):
address = to_checksum_address(address)
message = MsgCreatePaymentAccount(creator=address)
tx_hash = await self.blockchain_client.broadcast_message(
message=message, type_url="/greenfield.payment.MsgCreatePaymentAccount", fee=fee
messages=[message], type_url=["/greenfield.payment.MsgCreatePaymentAccount"], fee=fee
)

return tx_hash
Expand Down Expand Up @@ -74,7 +74,7 @@ async def transfer(self, from_address: str, to_address: str, amounts: List[Coin]
message = MsgSend(from_address=from_address, to_address=to_address, amount=amounts)

response = await self.blockchain_client.broadcast_message(
message=message, type_url="/cosmos.bank.v1beta1.MsgSend"
messages=[message], type_url=["/cosmos.bank.v1beta1.MsgSend"]
)
return response

Expand All @@ -91,7 +91,7 @@ async def multi_transfer(self, details: List[TransferDetails]) -> str:
input = Input(address=from_address, coins=[Coin(denom="BNB", amount=str(sum))])
message = MsgMultiSend(inputs=[input], outputs=outputs)
response = await self.blockchain_client.broadcast_message(
message=message, type_url="/cosmos.bank.v1beta1.MsgMultiSend"
messages=[message], type_url=["/cosmos.bank.v1beta1.MsgMultiSend"]
)
return response

Expand Down
2 changes: 1 addition & 1 deletion greenfield_python_sdk/greenfield/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,5 +180,5 @@ async def make_requests(self, method: str, params):

async def set_tag(self, resource_grn: str, tags: ResourceTags):
msg_set_tag = MsgSetTag(operator=self.key_manager.address, resource=resource_grn, tags=tags)
tx_hash = await self.blockchain_client.broadcast_message(message=msg_set_tag, type_url=TYPE_URL)
tx_hash = await self.blockchain_client.broadcast_message(messages=[msg_set_tag], type_url=[TYPE_URL])
return tx_hash
36 changes: 27 additions & 9 deletions greenfield_python_sdk/greenfield/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
MIGRATE_BUCKET,
UPDATE_BUCKET_INFO,
)
from greenfield_python_sdk.models.eip712_messages.storage.msg_set_tag import TYPE_URL
from greenfield_python_sdk.models.eip712_messages.storage.policy_url import DELETE_POLICY, PUT_POLICY
from greenfield_python_sdk.models.request import Principal, PutPolicyOption, ResourceType
from greenfield_python_sdk.models.transaction import BroadcastOption
Expand All @@ -34,6 +35,7 @@
MsgDeletePolicy,
MsgPutPolicy,
MsgRejectMigrateBucket,
MsgSetTag,
MsgUpdateBucketInfo,
QueryHeadBucketByIdRequest,
QueryHeadBucketRequest,
Expand Down Expand Up @@ -61,16 +63,28 @@ async def create_bucket(self, bucket_name: str, primary_sp_address: str, opts: C
get_approval, sp_signature = await self.storage_client.bucket.get_bucket_approval(
bucket_name, primary_sp_address, opts
)
messages = [get_approval]
type_url = [CREATE_BUCKET]

if opts.tags:
msg_set_tag = MsgSetTag(
operator=self.key_manager.address,
resource=f"grn:{ResourceType.RESOURCE_TYPE_BUCKET.value}::{bucket_name}",
tags=opts.tags,
)
messages.append(msg_set_tag)
type_url.append(TYPE_URL)

tx_hash = await self.blockchain_client.broadcast_message(
message=get_approval, type_url=CREATE_BUCKET, broadcast_option=BroadcastOption(sp_signature=sp_signature)
messages, type_url, broadcast_option=BroadcastOption(sp_signature=sp_signature)
)
return tx_hash

async def delete_bucket(self, bucket_name: str) -> str:
check_valid_bucket_name(bucket_name)

delete_bucket_msg = MsgDeleteBucket(operator=self.key_manager.address, bucket_name=bucket_name)
tx_hash = await self.blockchain_client.broadcast_message(message=delete_bucket_msg, type_url=DELETE_BUCKET)
tx_hash = await self.blockchain_client.broadcast_message(messages=[delete_bucket_msg], type_url=[DELETE_BUCKET])
return tx_hash

async def update_bucket_visibility(
Expand All @@ -94,7 +108,7 @@ async def update_bucket_visibility(
visibility=visibility,
)
tx_hash = await self.blockchain_client.broadcast_message(
message=update_bucket_visibility_msg, type_url=UPDATE_BUCKET_INFO
messages=[update_bucket_visibility_msg], type_url=[UPDATE_BUCKET_INFO]
)
return tx_hash

Expand Down Expand Up @@ -129,7 +143,9 @@ async def update_bucket_info(self, bucket_name: str, opts: UpdateBucketOptions)
payment_address=payment_address,
visibility=visibility,
)
tx_hash = await self.blockchain_client.broadcast_message(message=update_bucket_msg, type_url=UPDATE_BUCKET_INFO)
tx_hash = await self.blockchain_client.broadcast_message(
messages=[update_bucket_msg], type_url=[UPDATE_BUCKET_INFO]
)
return tx_hash

async def update_bucket_payment_addr(self, bucket_name: str, payment_addr: str) -> str:
Expand All @@ -144,7 +160,7 @@ async def update_bucket_payment_addr(self, bucket_name: str, payment_addr: str)
visibility=bucket_info.bucket_info.visibility,
)
tx_hash = await self.blockchain_client.broadcast_message(
message=update_bucket_payment_address_msg, type_url=UPDATE_BUCKET_INFO
messages=[update_bucket_payment_address_msg], type_url=[UPDATE_BUCKET_INFO]
)
return tx_hash

Expand Down Expand Up @@ -182,7 +198,7 @@ async def put_bucket_policy(
if opts and opts.policy_expire_time:
put_policy_msg.expiration_time = opts.policy_expire_time

tx_hash = await self.blockchain_client.broadcast_message(message=put_policy_msg, type_url=PUT_POLICY)
tx_hash = await self.blockchain_client.broadcast_message(messages=[put_policy_msg], type_url=[PUT_POLICY])
return tx_hash

async def delete_bucket_policy(self, bucket_name: str, principal: Principal) -> str:
Expand All @@ -193,7 +209,7 @@ async def delete_bucket_policy(self, bucket_name: str, principal: Principal) ->
resource=str(resource),
principal=principal,
)
tx_hash = await self.blockchain_client.broadcast_message(message=delete_policy_msg, type_url=DELETE_POLICY)
tx_hash = await self.blockchain_client.broadcast_message(messages=[delete_policy_msg], type_url=[DELETE_POLICY])
return tx_hash

async def get_bucket_policy(self, bucket_name: str, principal_addr: str) -> Policy:
Expand Down Expand Up @@ -243,7 +259,7 @@ async def buy_quota_for_bucket(self, bucket_name: str, target_quota: int) -> str
visibility=bucket_info.bucket_info.visibility,
)
tx_hash = await self.blockchain_client.broadcast_message(
message=update_quota_bucket_msg, type_url=UPDATE_BUCKET_INFO
messages=[update_quota_bucket_msg], type_url=[UPDATE_BUCKET_INFO]
)
return tx_hash

Expand All @@ -263,7 +279,9 @@ async def migrate_bucket(self, bucket_name: str, dst_primary_sp_id: int, opts: M
bucket_name, dst_primary_sp_id, opts
)
tx_hash = await self.blockchain_client.broadcast_message(
message=get_approval, type_url=MIGRATE_BUCKET, broadcast_option=BroadcastOption(sp_signature=sp_signature)
messages=[get_approval],
type_url=[MIGRATE_BUCKET],
broadcast_option=BroadcastOption(sp_signature=sp_signature),
)
return tx_hash

Expand Down
2 changes: 1 addition & 1 deletion greenfield_python_sdk/greenfield/challenge.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ async def submit_challenge(
segment_index=segment_index,
)
tx_response = await self.blockchain_client.broadcast_message(
message=message, type_url="/greenfield.challenge.MsgSubmit"
messages=[message], type_url=["/greenfield.challenge.MsgSubmit"]
)

return tx_response
Expand Down
10 changes: 5 additions & 5 deletions greenfield_python_sdk/greenfield/crosschain.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ async def transfer_out(
):
msg_transfer_out = MsgTransferOut(from_=self.storage_client.key_manager.address, to=to_address, amount=amount)
tx = await self.blockchain_client.broadcast_message(
msg_transfer_out, type_url="/greenfield.bridge.MsgTransferOut"
[msg_transfer_out], type_url=["/greenfield.bridge.MsgTransferOut"]
)
return tx

Expand All @@ -45,7 +45,7 @@ async def claims(
vote_addr_set=vote_addr_set,
agg_signature=agg_signature,
)
tx = await self.blockchain_client.broadcast_message(msg_claim, type_url="/cosmos.oracle.v1.MsgClaim")
tx = await self.blockchain_client.broadcast_message([msg_claim], type_url=["/cosmos.oracle.v1.MsgClaim"])

return tx

Expand Down Expand Up @@ -78,7 +78,7 @@ async def mirror_group(
)

tx = await self.blockchain_client.broadcast_message(
msg_mirror_group, type_url="/greenfield.storage.MsgMirrorGroup"
[msg_mirror_group], type_url=["/greenfield.storage.MsgMirrorGroup"]
)

return tx
Expand All @@ -95,7 +95,7 @@ async def mirror_bucket(
)

tx = await self.blockchain_client.broadcast_message(
msg_mirror_bucket, type_url="/greenfield.storage.MsgMirrorBucket"
[msg_mirror_bucket], type_url=["/greenfield.storage.MsgMirrorBucket"]
)

return tx
Expand All @@ -114,7 +114,7 @@ async def mirror_object(
)

tx = await self.blockchain_client.broadcast_message(
msg_mirror_object, type_url="/greenfield.storage.MsgMirrorObject"
[msg_mirror_object], type_url=["/greenfield.storage.MsgMirrorObject"]
)

return tx
Loading

0 comments on commit 23dfd1f

Please sign in to comment.